Goland的GC回識訓制
GC觸發的條件
-
閾值:默認記憶體擴大一倍,啟動gc
-
定期:默認2min觸發一次gc,
src/runtime/proc.go:forcegcperiod -
手動:
runtime.gc()
v1.3版本 標記清除法
第一步,找出不可達的物件,做上標記,
第二部,回收沒有被標記的物件,
缺點:在標記的時候會進行STW(Stop the world)
Stop the world
設定gcwaiting=1,這個在每一個G任務之前會檢查一次這個狀態,如是,則會將當前M 休眠;
如果這個M里面正在運行一個長時間的G任務,咋辦呢,難道會等待這個G任務自己切換嗎?這樣的話可要等10ms啊,不能等!堅決不能等! 所以會主動發出搶占標記(類似于上一篇),讓當前G任務中斷,再運行下一個G任務的時候,就會走到第1步
一直等待所有的M進入休眠,此時所有的業務邏輯代碼都停止
v1.5版本 三色標記法
-
啟動STW
-
新創建的物件默認顏色是白色
-
GC回收從根節點一次遍歷所有物件,把遍歷到的物件從白色集合放入灰色集合,
-
回圈遍歷灰色集合,將灰色物件參考的物件從白色集合放入灰色集合,之后將此灰色物件放入黑色集合,直到灰色中無任何物件
-
停止STW
-
回收所有的白色標記表的物件.也就是回收沒有被參考的物件(垃圾),
優化的點:Golang三色標記法中最后只剩下的黑白兩種物件,黑色物件是程式恢復后接著使用的物件,如果不碰觸黑色物件,只清除白色的物件,肯定不會影響程式邏輯,所以: 清除操作和用戶邏輯可以并發,
v1.8版本 混合寫屏障機制(hybrid write barrier)
寫屏障
該屏障之前的寫操作和之后的寫操作相比,先被系統其它組件感知, 通俗的講:就是在gc跑的程序中,可以監控物件的記憶體修改,并對物件進行重新標記,(實際上也是超短暫的stw,然后對物件進行標記)
總結:創建物件還是物件的參考改變,都會先變為灰色
步驟
-
掃描堆疊中記憶體物件全部標記黑色,對新增加的物件標記為黑色
-
掃描堆中的全部物件,把遍歷到的物件從白色集合放入灰色集合,
-
回圈遍歷灰色集合,將灰色物件參考的物件從白色集合放入灰色集合,之后將此灰色物件放入黑色集合,直到灰色中無任何物件,對重新參考的物件標記為灰色,對被添加的物件標記為灰色,
-
回收所有的白色標記表的物件.也就是回收垃圾,
優化的點:標記操作和用戶邏輯也是并發的,用戶邏輯會時常生成物件或者改變物件的參考,那么標記和用戶邏輯如何并發呢?因為用戶邏輯在會存在創建新的物件和改變物件參考的情況,所以寫屏障機制會把新的物件都會先變為灰色,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435323.html
標籤:Go
上一篇:盤點Go中的開發神器
