共计 1768 个字符,预计需要花费 5 分钟才能阅读完成。
序
本主要研究一下 Garbage Collector 的 SATB
CMS、G1、Shenandoah 在进行 concurrent marking 的都采用了 SATB 的技术
Shenandoah
Shenandoah 面向 low-pause-time 的垃圾收集器,它的 GC cycle 主要有
Snapshot-at-the-beginning concurrent mark 包括 Init Mark(Pause)、Concurrent Mark、Final Mark(Pause)
Concurrent evacuation(这个阶段用到了 Brooks Pointers(object version change with additional atomically changed indirection) 进行 copy)
Concurrent update references (optional) 包括 Init update Refs(Pause)、Concurrent update Refs、Final update Refs(Pause)
Shenandoah 在进行 concurrent marking 的时候采用了 SATB 的技术
SATB
SATB 全称为 Snapshot At The Beginning,其要点如下:
mark 的过程就是遍历 heap 标记 live object,采用的是三色标记算法,这三种颜色为 white(表示还未访问到)、gray(访问到但是它用到的引用还没有完全扫描)、black(访问到而且其用到的引用已经完全扫描完),整个三色标记算法就是从 GC roots 出发遍历 heap,针对可达对象先标记 white 为 gray,然后再标记 gray 为 black;遍历完成之后所有可达对象都是 black 的,所有 white 都是可以回收的
SATB 仅仅对于在 marking 开始阶段进行 ”snapshot”(marked all reachable at mark start),但是 concurrent 的时候并发修改可能造成对象漏标记,比如
对 black 新引用了一个 white 对象,然后又从 gray 对象中删除了对该 white 对象的引用,这样会造成了该 white 对象漏标记
对 black 新引用了一个 white 对象,然后从 gray 对象删了一个引用该 white 对象的 white 对象,这样也会造成了该 white 对象漏标记
对 black 新引用了一个刚 new 出来的 white 对象,没有其他 gray 对象引用该 white 对象,这样也会造成了该 white 对象漏标记
对于三色算法在 concurrent 的时候可能产生的漏标记问题,SATB 在 marking 阶段中,对于从 gray 对象移除的目标引用对象标记为 gray,对于 black 引用的新产生的对象标记为 black;由于是在开始的时候进行 snapshot,因而可能存在 Floating Garbage
小结
CMS、G1、Shenandoah 在进行 concurrent marking 的时候都采用了 SATB 的技术;SATB concurrent mark 便是 Shenandoah GC 的第一个 cycle
遍历 heap 标记 live object,采用的是三色标记算法,这三种颜色为 white(表示还未访问到)、gray(访问到但是它用到的引用还没有完全扫描)、black(访问到而且其用到的引用已经完全扫描完),整个三色标记算法就是从 GC roots 出发遍历 heap,针对可达对象先标记 white 为 gray,然后再标记 gray 为 black;遍历完成之后所有可达对象都是 black 的,所有 white 都是可以回收的
SATB 仅仅对于在 marking 开始阶段进行 ”snapshot”(marked all reachable at mark start);在 marking 阶段中,对于从 gray 对象移除的目标引用对象标记为 gray,对于 black 引用的新产生的对象标记为 black;由于是在开始的时候进行 snapshot,因而可能存在 Floating Garbage
doc
snapshot-at-the-beginning
Shenandoah GC: Concurrent parallel marking
Floating Garbage
[HotSpot] VM 关于 incremental update 与 SATB 的一点理解
Java Hotspot G1 GC 的一些关键技术