聊聊Garbage Collector的SATB


本主要研究一下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的一些关键技术

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理