聊聊Go的三色標記法
這里是Z哥的個人公眾號
每周五11:45 按時送達
當然了,也會時不時加個餐~
我的第「203」篇原創(chuàng)敬上

標記出哪些對象是存活的,哪些是可回收的。
進行回收(清除/復制/整理)。如果在回收期間有移動過的對象(復制/整理),還需要更新引用。
標記 GC ROOT 能關聯(lián)到的對象。這里會 STW。
從 GCRoots 的直接關聯(lián)對象開始遍歷整個對象圖。這里不會STW。
白色,初始值。本次回收沒被掃描過的對象默認都是白色的。而確認不可達的對象也是白色,但是會被標記「不可達」。
灰色,中間狀態(tài)。本對象有被外部引用,但是本對象引用的其它對象尚未全部檢測完。
黑色,本對象有被其它對象引用,且已檢測完本對象引用的其它對象。



在斷開引用的時候做額外處理。
在「黑色」對象重新建立「白色」對象的引用時做額外處理。(回收開始后新建的對象默認為黑色)。
增量更新(Incremental Update)。針對新增的引用,將其記錄下來等待重新遍歷。這個操作在「修改操作后」進行,JVM 中的 CMS 垃圾回收器就是這個思路。
原始快照(Snapshot At The Beginning,SATB)。當某個時刻 的 GC Roots 確定后,當時的對象圖就已經確定了。如果期間發(fā)生變化,則可以記錄起來,保證標記依然按照原本的視圖來。這個操作在「修改操作前」進行,JVM中 的 G1 垃圾回收器用的就是這個思路。理論上,配合 「Remembered Set」,SATB 的效率是比增量更新要高的,不過會消耗更多的內存。
將對象分為堆上的對象和棧上的對象。
GC 開始將棧上的對象全部掃描并標記為黑色,無需 STW。并且之后不再進行第二次重復掃描
在 GC 期間,任何在棧上創(chuàng)建的新對象,均為黑色。
在 GC 期間,在堆上被刪除或者添加的對象都標記為灰色。后續(xù)繼續(xù)掃描。
白色,默認值。本次回收沒被掃描過的對象都是白色的。確認不可達的對象也是白色,但是會被標記「不可達」。
灰色,中間狀態(tài)。本對象有被外部引用,但是本對象引用的其它對象尚未全部檢測完。
黑色,本對象有被其它對象引用,且已檢測完本對象引用的其它對象。
將對象分為堆上的對象和棧上的對象。
GC 開始將棧上的對象全部掃描并標記為黑色,無需 STW。并且之后不再進行第二次重復掃描
在 GC 期間,任何在棧上創(chuàng)建的新對象,均為黑色。
在 GC 期間,在堆上被刪除或者添加的對象都標記為灰色。后續(xù)繼續(xù)掃描。
推薦閱讀:
原創(chuàng)不易,如果你覺得這篇文章還不錯,就「點贊」或者「在看」一下吧,鼓勵我的創(chuàng)作 :)
也可以分享我的公眾號名片給有需要的朋友們。
如果你有關于軟件架構、分布式系統(tǒng)、產品、運營的困惑
可以試試點擊「閱讀原文」
