首先要區分版本 每個版本更新的內容是不一致的
首先,stw(stop the world)再由程式出發 標記可達的物件 然後將不可達的物件進行**缺點:
標記需要掃瞄整個heap
清除資料會產生heap碎片
白灰黑 灰是臨時的存放點 直到只剩下白和黑三色標記法若不使用stw機制,會導致誤**的情況(誤**情況是黑色引用白色,灰色同時失去和白的的關係)程式起初物件都是白色
gc遍歷root set 只走1層,將有聯絡的物件製成灰色
再遍歷灰色的節點,有下乙個聯絡就將本身標記黑色,有聯絡的標記灰色
全盤使用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 不能用額外的記憶體,換句...