JVM(三)GC垃圾回收以及四种GC算法
JVM(三)
一、GC垃圾回收
垃圾回收只存在于堆和方法区中(方法区本质上也属于堆)。
JVM在进行GC时,并不是对这三个区域统一回收。大部分时候,回收都是新生代。
-
新生代 幸存区(from区、to区/0区、1区) 老年区
GC有两种类型:轻GC(普通GC,发生在新生代和幸存区)、重GC(全局GC)
GC题目:
- JVM的内存模型和分区,详细到每个区放什么
- 堆里面的分区有哪些?Eden、from、to、老年区,说说他们的特点
- GC的算法有哪些,怎么用的?标记清除法、标记压缩法、复制算法、引用计数法
- 轻GC和重GC分别在什么时候发生
二、GC算法之引用计数法
这种方法不好,高效且low,用的很少。
三、GC算法之复制算法
新生区主要用的复制算法。
步骤:
-
第一步:Eden区中的对象移动到幸存区to区 第二步:幸存区from区中的对象移动到幸存区to区,此时from区和to区互换了(谁空谁是to) 第三步:幸存区对象满15(15次GC也没有清除)则进入养老区,否则离开(被清除)
好处:没有内存的碎片
坏处:浪费了内存空间(一半的幸存区(to区)空间永远是空的)
复制算法最佳使用场景:对象存活度较低的时候,也就是新生区。
四、GC算法之标记清除算法
扫描所有对象,对活着的对象进行标记;然后清除掉没有标记的对象。
优点:
-
不需要额外空间
缺点:
-
两次扫描严重浪费时间 会产生内存碎片(上图虚线框)
五、GC算法之标记压缩算法
标记压缩算法是标记清除方法的一个优化。在标记清除的前提下再次扫描,向一端移动存活的对象,会增加一个“移动”耗费的成本。
压缩的目的:防止内存碎片的产生。
其名称曰:标记清楚压缩算法。因为是在标记清除算法的基础上做的。
六、对比总结
内存效率、整齐度、利用率
-
内存效率:复制算法 > 标记清除算法 > 标记压缩算法(时间复杂度) 内存整齐度:复制算法 = 标记压缩算法 > 标记清除算法 内存利用率:标记压缩算法 = 标记清除算法 > 复制算法
没有最优的算法,只有最合适的算法。 GC:也被称为分代收集算法。“分代”:
-
新生代:存活率低,使用复制算法 老年代:区域大,存活率高,使用标记清除+标记压缩混合实现