1. 程式人生 > 其它 >Golang——GC機制簡要歸納(1.8版本後)

Golang——GC機制簡要歸納(1.8版本後)

  Golang通過遍歷程式的所有物件,發現當前沒有被引用的物件,來將這些資源進行GC。

  Golang1.8版本後的GC機制,主要採用三色標記法+混合寫屏障。

  三色分別為:

  白色(當前沒有遍歷到,或程式沒有使用到的物件)

  灰色(當前遍歷到的物件)

  黑色(遍歷結束,確認程式會使用到的物件)  

  三色標記法:從程式引用物件的根集合開始,遍歷完程式所有引用到的物件,剩餘沒有被標記到的白色物件進行GC。

  可能存在的問題——取消了STW,可能會出現物件丟失的問題:

  (1)黑色物件引用了白色物件。

  (2)灰色物件同時也丟失了這個白色物件。

  這樣最終刪掉這個白色物件時,導致前一個黑色物件無法正常繼續使用。

  為了防止這種情況的發生,我們可以破壞這兩種必要條件,增加遍歷過程中的兩種限制:

  強三色不變式:強制性不允許黑色物件引用白色物件(破壞條件1)。

  弱三色不變式:允許黑色物件引用白色物件,但是必須保證白色物件要被別的灰色物件引用(破壞條件1)。

  混合寫屏障過程:

  1.初始將所有棧上物件全部置黑,新增加的棧物件也置黑。(棧上不啟動屏障,只在堆上啟動)

  2.掃描過程中,插入的物件置灰,刪除的物件也置灰。