SATB深入詳解與問題剖析【純理論】

延着上一次【https://www.cnblogs.com/webor2006/p/11147893.html】的理論繼續。

SATB:

  • 在G1中,使用的是SATB(Snapshot-At-The-Beginning)的方式,刪除的時候記錄所有的對象。
  • 它有3個步驟【重要!】:
    1、在開始標記的時候生成一個快照圖,標記存活對象。
    2、在併發標記的時候所有被改變的對象入隊(在write barrier【寫屏障】裏把所有舊的引用所指向的對象都變成非白的)。
    這樣的話對於之前用三色標記可能出錯的這個白色對象就會變成灰色的,如下:

    就可以避免C正常的不被回收了。
    3、可能存在浮動垃圾,將在下次被收集。

G1混合式回收:

  • G1到現在可以知道哪些老的分區可加收垃圾最多。當全局併發標記完成後,在某個時刻,就開始了Mixed GC。這些垃圾回收被稱作“混合式”是因爲他們不僅僅進行正常的新生代垃圾收集,同時也回收部分後臺掃描線程標記的分區。
  • 混合式GC也是採用的複製清理策略,當GC完成後,會重新釋放空間。

G1分代算法:

  • 爲老年代設置分區的目的是老年代裏有的分區垃圾多,有的分區垃圾少,這樣在回收的時候可以專注於收集垃圾多的分區,這也是G1名稱的由來。
  • 不過這個算法並不適合新生代垃圾收集,因爲新生代的垃圾收集算法是複製算法,但是新生代也使用了分區機制主要是因爲便於代大小的調整。 

SATB詳解:

  • SATB是維持併發GC的一種手段。G1併發的基礎就是SATB。SATB可以理解成在GC開始之前對堆內存裏的對象做一次快照,此時活的對像就認爲是活的,從而開成一個對象圖。
  • 在GC收集的時候,新生代的對象也認爲是活的對象,除此之外其他不可達的對象都認爲是垃圾對象。
  • 如何找到在GC過程中分配的對象呢?每個region記錄着兩個top-at-mark-start(TAMS)指針,分別爲prevTAMSnextTAMS。在TAMS以上的對象就是新分配的,因而被視爲隱式marked
  • 通過這種方式我們就找到了在GC過程中新分配的對象,並把這些對象認爲是活的對象。
  • 解決了對象在GC過程中分配的問題,那麼在GC過程中引用發生變化的問題怎麼解決呢?
  • G1給出的解決辦法是通過Write Barrier。Write Barrier就是對引用字段進行賦值做了額外處理。通過Write Barrier就可以瞭解到哪些引用對象發生了什麼樣的變化。
  • mark的過程就是遍歷heap標記live object的過程,採用的是三色標記算法,這三種顏色爲white(表示還未訪問到)、gray(訪問到但是它用到的引用還沒有完全掃描)、back(訪問到而且其用到的引用已經完全掃描完)。
  • 整個三色標記算法就是從GC roots出發遍歷heap,針對可達對象先標記white爲gray,然後再標記gray爲black;遍歷完成之後所有可達對象都是balck的,所有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對象漏標記。

轉載於:https://www.cnblogs.com/webor2006/p/11148282.html

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章