G1垃圾收集器

    技术2022-07-10  115

    G1垃圾收集器

    一、特点:并行与并发

    并行:多线程的垃圾收集。并发:和用户线程并发执行。

    内存模型不同:强调分区而不是分代。在使用G1垃圾收集器时堆会被划分成多个大小相等的region,虽然还有新生代老年代的概念但是他们不再是物理的隔离,而是都是一部分的region的集合。两个region之间采用的复制算法实现,从整体上又符合标记整理算法的特征。

    可预测停顿:G1可根据region的回收价值,回收部分最有价值的堆空间而不是进行全部老年代的扫描。根据用户设定的最大GC暂停参数,建议可预测的停顿。

    空间整合:局部采用复制算法,多个region整合成一个region,实现天然的压缩,去碎片化。

    二、关键词

    region:大小相等的物理联系的内存,大小在1-32M之间,默认将堆划分成2000多个region。

     

    rset:cset用来记录其他region的对象对于本region中对象的引用。这样的目的是防止在做可达性分析的时候,进行全堆的扫描。一般是记录old—>young,或者old—>old 。

    cset:需要回收的region的集合。young GC的时候就是young region集合,mixed GC的时候就是young region和部分old region的集合。在进行GC时Cset中的存活对象都会被转移,region会被释放进行空间分区。

    satb算法:

    对象分配规则

    IHOP:发生老年代GC时候的老年代在堆总的占比。G1的占比是针对整个堆的,CMS的占比是老年代的。

     三、   GC的流程

    G1的垃圾回收周期主要有包含4个阶段:

    young GC

    并发标记周期

    mixed GC

    full GC(担保机制)

    young GC:STW,并行

    触发条件:eden region达到上限。

    构建CSet,决定回收哪些region(eden和survivor)

    扫描GC roots

    更新 Rset

    扫描 Rset的old->young的引用

    执行object copy.

    并发标记周期

    初始标记:STW。当到达IHOP的时候并不会立即开始初始标记,而是等到下一个young GC ,借着它的的STW,完成GC Roots直达对象的扫描。

    根分区扫描:初始标记后,年轻代也完成了存活对象到survivor region的复制,此时用户线程也开始运行,为了保证标记算法准确性,此时会把survivor的所有对象都会被扫描成根。

    并发标记:和用户线程并发执行。三色标记算法,找到所有存活的对象。

    重新标记:STW。SATB,重新标记哪些漏标,错标的对象。

    清除:STW。

    整理堆分区,为mixedGC阶段识别收益率高的old region集合。

    回收那些无存活对象的空闲分区。但是不会对那些有部分垃圾的region的存活对象的copy。

    mixed GC

    mixed GC和young GC类似,只不过在Cset中会包含部分要回收的old region。

    mixed GC会执行多次,有两个参数可以控制:

    -XX:G1MixedGCCountTarget:默认是8,即至多进行8次mixed GC,G1会根据这个值计算每次Cset中old region的数量。

    -XX:G1HeapWastePercent:默认值是5,当mixeddGC后G1算出垃圾的占比,达到此值则不再进行mixedGC。

    full GC:触发条件:满足以下两个条件 当对象晋升担保失败或者大对象分配失败,没有可用空闲分区可用在条件以下,申请增加对空间失败,则会触发full GCfull GC会STW、单线程、对所有分区进行标记、清除和压缩。

     

    四、和CMS的比较

    内存模型不同!CMS按照传统的分代模型,G1按照分区。

    算法不同!G1采用局部复制算法整体有压缩,整理碎片的功能,CMS采用标记清除算法,会产生碎片。

    回收的范围不同!CMS会回收整个老年代,G1按照用户的需求回收有价值的old region。

    触发full GC的机制不同!CMS的是按照老年代中被占用的占比,而G1是按照老年代在对整个堆中的占比。

    G1可以满足整个堆的垃圾回收,CMS要搭配年轻代的垃圾收集器。

    Processed: 0.009, SQL: 9