Golang——GC機制簡要歸納(1.8版本後)
阿新 • • 發佈:2022-03-05
Golang通過遍歷程式的所有物件,發現當前沒有被引用的物件,來將這些資源進行GC。
Golang1.8版本後的GC機制,主要採用三色標記法+混合寫屏障。
三色分別為:
白色(當前沒有遍歷到,或程式沒有使用到的物件)
灰色(當前遍歷到的物件)
黑色(遍歷結束,確認程式會使用到的物件)
三色標記法:從程式引用物件的根集合開始,遍歷完程式所有引用到的物件,剩餘沒有被標記到的白色物件進行GC。
可能存在的問題——取消了STW,可能會出現物件丟失的問題:
(1)黑色物件引用了白色物件。
(2)灰色物件同時也丟失了這個白色物件。
這樣最終刪掉這個白色物件時,導致前一個黑色物件無法正常繼續使用。
為了防止這種情況的發生,我們可以破壞這兩種必要條件,增加遍歷過程中的兩種限制:
強三色不變式:強制性不允許黑色物件引用白色物件(破壞條件1)。
弱三色不變式:允許黑色物件引用白色物件,但是必須保證白色物件要被別的灰色物件引用(破壞條件1)。
混合寫屏障過程:
1.初始將所有棧上物件全部置黑,新增加的棧物件也置黑。(棧上不啟動屏障,只在堆上啟動)
2.掃描過程中,插入的物件置灰,刪除的物件也置灰。