Golang三色標記GC和混合寫屏障筆記

2021-10-11 14:34:54 字數 828 閱讀 1241

首先要區分版本 每個版本更新的內容是不一致的

首先,stw(stop the world)再由程式出發 標記可達的物件 然後將不可達的物件進行**

缺點

標記需要掃瞄整個heap

清除資料會產生heap碎片

白灰黑 灰是臨時的存放點 直到只剩下白和黑

程式起初物件都是白色

gc遍歷root set 只走1層,將有聯絡的物件製成灰色

再遍歷灰色的節點,有下乙個聯絡就將本身標記黑色,有聯絡的標記灰色

三色標記法若不使用stw機制,會導致誤**的情況(誤**情況是黑色引用白色,灰色同時失去和白的的關係)

全盤使用stw和mark and sweep沒有啥區別,時間用的還是很久

思路 誤**需要兩點同時滿足,打破乙個條件即可

強弱三色不變式

黑色不允許引用白色(破壞條件1

黑色允許引用白色,但白色上游鏈路上有灰色(破壞條件2

插入寫屏障

只要a引用了b,那麼b就被定義為灰色(滿足強三色不變式)

不在棧上使用 為了保證壓棧出棧的速度

所以最後要在棧上再stw再掃瞄一遍棧 大約10~100ms

刪除寫屏障

被刪除的物件,如果自身是灰色或者白色,那麼被標記為灰色

缺點 **精度比較低

Go的三色標記GC

三色標記的原理如下 整個程序空間裡申請每個物件佔據的記憶體可以視為乙個圖,初始狀態下每個記憶體物件都是白色標記,先stop the world,將掃瞄任務作為多個併發的goroutine立即入隊給排程器,進而被cpu處理,第一輪先掃瞄所有可達的記憶體物件,標記為灰色放入佇列 第二輪可以恢復start...

雙色 三色排序問題

實現乙個函式,給定乙個陣列,要求使得陣列中負數在所有正數的前面 實現乙個函式,給定乙個陣列,要求使得陣列中負數在前正數在後零在中間 1 include2 include34 輸出陣列元素 5void print int arr,int len 6 交換兩個數 7void swap int left,...

三色旗問題

三色旗問題 假設有乙個陣列,它有n個元素,每乙個不外乎是紅,白,藍3種顏色之一的代號,就用r,w,b代表。這些元素在陣列中並沒有依同樣顏色的元素排在一起的方式來排列,請寫乙個程式把這些元素排成所有藍色在前,接著是白色,最後是紅色的排列方式,不過在寫程式時要滿足下面的條件 1 不能用額外的記憶體,換句...