聊聊Garbage Collector的SATB

本主要研究一下Garbage Collector的SATBhtml

CMS、G一、Shenandoah在進行concurrent marking的都採用了SATB的技術

Shenandoah

Shenandoah面向low-pause-time的垃圾收集器,它的GC cycle主要有java

  • 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、G一、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

相關文章
相關標籤/搜索