其他
用了很多年的 CMS 垃圾收集器,终于换成了 G1,真香!!
Motivation
基本数据结构
Heap Regions
Remember Set (RSet)
Remember Set 的维护
t = (rX XOR rY) >> LogOfRegionSize // 对 X, Y 地址右移得到 Region 编号,并将二者做个 XOR
if (rY == NULL ? 0 : t) // 忽略两种情况:X.f 被赋值为 NULL,或 X 和 Y 位于同一个 Region 内
rs_enqueue(rX) // 如果 Card(X) 还不是 dirty 的,将 X 的地址放进 Log,并把该 card 置为 dirty
Generational Garbage-First
Evacuation
Evacuation 的时候,Young Regions 一定会被放到待收集的 Regions 集合(Collection Set)中,原因很简单,绝大多数对象寿命都很短,在 Young Regions 做收集往往绝大部分都是垃圾。 由于 Young Regions 一定会被收集,我们获得了一个可观的收益:Remember Set 的维护工作不需要考虑 Young 内的引用修改(换句话说 RSet 只关心 old-to-young 和 old-to-old 的引用),当 Young Region 上发生 Evacuation 时我们再去扫描并构建出它的 RSet 即可。
Concurrent Marking
t = the previous referenced address // 记录原本的引用地址
if (t has been marked && t != NULL) // 如果地址 t 还没来的及标记,且 t 不为 NULL
satb_enqueue(t) // 放到 SATB 的待处理队列中,之后会去扫描这个引用
往期推荐