垃圾收集器: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进行清理,不是全部,提高了效率。

posted @ 2020-09-03 16:16  昆梧  阅读(301)  评论(0)    收藏  举报