垃圾收集器:CMS 和 G1
CMS
在G1推出以前,CMS垃圾收集器更受服务器欢迎,因为它大大缩短了单次GC的时间。
处理过程
1.初次标记:标记GCRoot直接引用的对象。(STW,时间较短)
2.并发标记:通过可达性分析算法,找到所有存活的对象。(并发执行,减少时间)
3.重新标记:修正上一步的并发标记,确保标记对象的准确。(STW,时间中等)
4.标记清理:在对象原位置直接清除对象。(由于是标记清理,不需要STW)
G1
G1垃圾收集器不再给堆内存划分成几块大空间,而是将整个堆内存划分成2000块左右的Region区,Region区的大小只会是2的次幂M,最小1M,最大32M。每一块Region都可以作为E区、S区和O区。
空间整合:在清理对象时,会完成内存的整理,不会产生内存空间碎片。
可预测停顿:降低停顿时间是G1和CMS的共同关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让程序员明确指定在一个长度为N毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。
大对象的处理
1.当对象小于RegionSize的一半时,对象会被存放在E区。
2.当对象大于RegionSize的一半,且小于RegionSize时,会被存放在O区,这个Region也被称为Humongous Region。
3.当对象大于RegionSize时,会为其开辟连续的Region空间进行存放,这多个空间都是Humongous Region。
两个Sets
RemeberSets:每个Region都有的一块内存空间,用来存储本Region对象被其他Region对象引用的记录。
CollectionSets:存储需要进行垃圾收集的Regions集合。
处理过程
YoungGC
复制算法,STW,将E区和Survivor From中存活的对象复制到Survivor To和O区中,清除E区和Survivor From的内存空间。
MixGC
本质上不只是针对老年代,也有年轻代,所以叫MixGC。
1.初次标记:标记所有GCRoot对象所在的Region,得到RootRegion。(是在YoungGC的过程中完成的,基本避免了这段时间的消耗)
2.RootRegionScan:扫描O区Region,根据Region的RemeberSets,标记被RootRegion引用的Region。
3.并发标记:遍历所有被标记的Region,判断对象是否存活,标记存活对象。(如果整个Region中没有对象存活,则标记为X)
4.重新标记:对上一步并发标记的修正,保证标记的准确性。(使用了SATB,STW,此时标记为X的Region被清除)
5.复制清理:选取所有Y区Region和存活率较低的O区Region组成CollectionSets,进行复制清理,复制的同时会将对象复制到另一处,因此也达到了整理的效果。(因为只涉及到被标记的Y区Region和被标记的O区Region中的一部分,所以时间很短)
RootRegionScan的作用
在初次标记时,标记出了RootRegion,在RootRegionScan时就可以通过RootRegion和Rsets缩小O区的并发标记扫描范围,提高了并发标记的效率。
RemeberSets的作用
1.在YGC时,因为不清理O区,所以所有O区Region都是RootRegion,因此做可达性分析时需要遍历所有O区Region,但有了Rsets,就可以知道Y区有哪些Region存在被O区Region引用的情况,避免了扫描整个O区。
2.在MixGC时,通过Rsets可以找到被RootRegion引用的O区Region,缩小整个并发标记的范围,而不需要扫描整个O区,大大提高了效率。
提升效率的地方
1.初次标记与YoungGC同时进行。
2.Rset降低了扫描的范围。(YGC,MixGC)
3.重新标记时,标记为X的Region直接被清除。
4.重新标记阶段使用了SATB,比CMS的速度更快。
5.清理过程中O区的Region只选择了存活率较低的Region进行清理,不是全部,提高了效率。

浙公网安备 33010602011771号