本主要研究一下Garbage Collector的SATBhtml
CMS、G一、Shenandoah在进行concurrent marking的都采用了SATB的技术
Shenandoah面向low-pause-time的垃圾收集器,它的GC cycle主要有java
包括Init Mark(Pause)、Concurrent Mark、Final Mark(Pause)
这个阶段用到了Brooks Pointers(
object version change with additional atomically changed indirection)进行copy
)包括Init update Refs(Pause)、Concurrent update Refs、Final update Refs(Pause)
Shenandoah在进行concurrent marking的时候采用了SATB的技术
SATB全称为Snapshot At The Beginning,其要点以下:算法
表示还未访问到
)、gray(访问到可是它用到的引用尚未彻底扫描
)、black(访问到并且其用到的引用已经彻底扫描完
),整个三色标记算法就是从GC roots出发遍历heap,针对可达对象先标记white为gray,而后再标记gray为black;遍历完成以后全部可达对象都是black的,全部white都是能够回收的SATB仅仅对于在marking开始阶段进行"snapshot"(marked all reachable at mark start
),可是concurrent的时候并发修改可能形成对象漏标记,好比并发
表示还未访问到
)、gray(访问到可是它用到的引用尚未彻底扫描
)、black(访问到并且其用到的引用已经彻底扫描完
),整个三色标记算法就是从GC roots出发遍历heap,针对可达对象先标记white为gray,而后再标记gray为black;遍历完成以后全部可达对象都是black的,全部white都是能够回收的marked all reachable at mark start
);在marking阶段中,对于从gray对象移除的目标引用对象标记为gray,对于black引用的新产生的对象标记为black;因为是在开始的时候进行snapshot,于是可能存在Floating Garbage