vlambda博客
学习文章列表

关于G1垃圾回收器的一些技术

G1收集器

描述:注重吞吐量的响应时间优先回收器

内存中模型

内存为块状不连续内存,每个内存块内部连续称之为region,其中老年代region中有种H-obj,大小为region的一半,region大小可以通过参数-XX:G1HeapRegionSize设定,取值范围从1M到32M

region本身就是一块内存空间,新建对象时region逻辑上就属于新生代,经历过gc并且存活下来region就在逻辑上属于老年代,region被清空回收就变为了空白属性的单纯内存块,所属于新生代的region数量由回收器管控,配合达到用户设定的期望回收时间,回收时间越长数量越多,时间越短数量约少,但是数量太少会频繁触发gc(默认时间200ms,通过参数-XX:MaxGCPauseMillis设置);

gc过程

young gc

所有属于年轻代的region,通过控制region数量来控制回收停顿时间

为什么不需要扫描老年代

Mixed GC

年轻代region和部分高收益的老年代对象

为什么不需要进行老年代全部扫描

老年代RSET中记录了old->old的关系,年轻代由young->old由年轻代中RSET提供

所用垃圾回收算法

标记复制算法

三色标记算法

黑色

根对象,或者该对象与它的子对象都被扫描过

灰色

对象本身被扫描,但是还有没扫描该对象的子对象

白色

未被扫描的对象,如果扫描完成所有对象之后,最终为白色的为不可达对象,即垃圾对象

回收过程

初始标记

标记gc root直接可达的对象 stw(停顿标记)

并发标记

堆中标记,标记那些灰色节点,gc线程和程序线程并发执行

最终标记

标记在并发标记过程中发生变动的对象stw

垃圾清除

清除对象,将清空region放入列表

关键技术

对象消失问题处理

解决并发标记准确性问题,并发标记中白色节点可能发生变化,出现白色对象漏标现象,所谓对象消失

解决方式

增量更新

黑色节点新增引用时会变为灰色节点

原始快照(STAB)

将扫描中灰色节点删除的引用对象情况进行快照处理,扫描完成后根据快照再进行扫描

发生场景

1.黑色节点引用了白色节点(黑色节点扫描了之后不会重新扫描)

2.灰色节点引用被删除;

停顿时间问题

停顿预测模型(Pause Prediction Model)

g1通过历史回收时间决定本次回收的region数量来达到满足预期停顿时间,基于衰减标准偏差为理论基础实现

主要考虑均值时间,预测准确度(信任度)进行计算