GC垃圾回收
垃圾回收的区域
JVM在进行GC时,并不是对这三个区域统一回收,大部分的时候,回收都是新生代
-
新生区
-
幸存区
-
老年区
GC种类:
-
轻GC(普通的GC)
-
重GC(全局的GC)
GC题目:
-
JVM的内存模型和分区,详细到每个区放什么?
-
堆里面的分区有哪些?Eden,from,to,老年区,说说他们的特点
-
GC的算法有哪些?怎么用?
-
标记清除法
-
标记压缩
-
复制算法
-
引用计数器
-
-
轻GC和重GC分别是在什么什么时候发生?
复制算法
为了解决标记清除算法的内存碎⽚问题,就产⽣了复制算法。复制算法将内存分为⼤⼩ 相等的两半,每次只使⽤其中⼀半。垃圾回收时,将当前这⼀块的存活对象全部拷⻉到另⼀半,然 后当前这⼀半内存就可以直接清除。这种算法没有内存碎⽚,但是他的问题就在于浪费空间。⽽ 且,他的效率跟存活对象的个数有关。
- 好处:没有内存的碎片
- 坏处:浪费了内存空间(多了一半空间to永远是空)。假设对象100%存活(极端情况),不适合使用复制算法
使用场景
复制算法最佳使用场景:对象存活度较低的时候(新生区)
标记清除算法
a. 标记阶段:把垃圾内存标记出来
b. 清除阶段:直接将垃圾内存回收。
c. 这种算法是⽐较简单的,但是有个很严重的问题,就是会产⽣⼤量的内存碎⽚。
- 优点:不需要额外的空间
- 缺点:两次扫描,严重浪费时间,会产生内存碎片
标记压缩算法
为了解决复制算法的缺陷,就提出了标记压缩算法。这种算法在标记阶段跟标记清除算法是⼀样的,但是在完成标记之后,不是直接清理垃圾内存,⽽是将存活对象往⼀端移动,然 后将边界以外的所有内存直接清除
可以进行多次标记清除,再进行一次压缩
GC算法总结
内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记压缩算法=标记清除算法>复制算法
思考一个问题:难道没有最优算法吗?
答案:没有,没有最好的算法,只有最合适的算法——》GC:分代收集算法
年轻代:
- 存活率低
- 复制算法
老年代:
- 区域大:存活率高
- 标记清除(内存碎片不是太多)+标记压缩混合实现