本主要研究一下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