Go的三色標記GC

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

三色標記

三色標記的原理如下:
整個進程空間裡申請每個對象佔據的記憶體可以視為一個圖, 初始狀態下每個記憶體對象都是白色標記,先stop the world,將掃描任務作為多個並發的goroutine立即入隊給調度器,進而被CPU處理,第一輪先掃描所有可達的記憶體對象,標記為灰色放入隊列;第二輪可以恢複start the world,將第一步隊列中的對象引用的對象置為灰色排入佇列,一個對象引用的所有對象都置灰並排入佇列後,這個對象才能置為黑色並從隊列之中取出。迴圈往複,最後隊列為空白時,整個圖剩下的白色記憶體空間即不可到達的對象,即沒有被引用的對象; 第三輪再次stop the world,將第二輪過程中新增對象申請的記憶體進行標記(灰色),這裡使用了writebarrier(寫屏障)去記錄這些記憶體的身份;

整個gc的流程如:

注意到:
mark 有兩個過程。

首先從 root 開始遍曆,root 包括全域指標和 goroutine 棧上的指標,標記為灰色。遍曆灰色隊列。

re-scan 全域指標和棧。因為 mark 和使用者程式是並行的,所以在過程 1 的時候可能會有新的對象分配,這個時候就需要通過寫屏障(write barrier)記錄下來。re-scan 再完成檢查一下。

Stop The World 有兩個過程。

第一個是 GC 將要開始的時候,這個時候主要是一些準備工作,比如 enable write barrier。

第二個過程就是上面提到的 re-scan 過程。如果這個時候沒有 stw,那麼 mark 將無休止。

mark完畢後start the world進行並行清理,對於並行清理,GC 初始化的時候就會啟動 bgsweep()這個協程並一直在後台阻塞, 開始清理時將這個協程喚醒並給主M去做並發的sweep。

記憶體管理都是基於 span 的,mheap_ 是一個全域的變數,所有分配的對象都會記錄在 mheap_ 中。在標記的時候,我們只要找到對對象對應的 span 進行標記,清掃的時候掃描 span,沒有標記的 span 就可以回收了。

另外:1.8以後的golang將第一步的stop the world 也取消了,這又是一次最佳化。

寫屏障

關於寫屏障的用處 如下面的例子,這個例子修改自知乎上的一個問答,在此表示感謝:

GC前:
stack->a->b ; a為棧中申請的對象,b為堆中申請的對象,a對象中存在對b的引用;

stack->c ; c 也是棧中申請的對象。

stop the world, mark。 這裡a,c都會被標記為灰色;b為白色
start the world 反覆mark。
由於是並發的mark,我們假設c先被處理,c沒有引用其他對象,所以直接置黑,從隊列中取出;此時c為黑色,a為灰色,b為白色

假設這時使用者做了如下操作:

a=nil
new(d);
c->b; 即,將a中對b的引用置為空白(你也可以理解為將a中對其他任何記憶體對象的引用都清空),隨即申請d對象,然後在c中增加對b的引用。

由於c已經是黑色,所以不會再去掃描他,那麼本次記憶體掃描就不可能找得到b;而d對象由於剛申請出來,還沒有被引用,所以這裡只對a進行了mark:a:黑色,b:白色;c:黑色;d:白色

這時使用者又做了:
b->d; 由於b無法被掃描到,這裡顯然d也不會被掃描到。 這樣的狀況會一直持續到這輪反覆mark結束(即灰色隊列為空白)。

stop the world, mark termination。 sweep。 整個GC結束, b,d的記憶體空間都是白色,所以在sweep時會被清理掉。如何避免這種誤清理呢?

寫屏障的功能就是在 c->b發生時,對b做一個標記, 以及在a->d發生時,對d做一個標記,這樣,在進入第二次stop the world, mark termination時,這時候我們確保不會再有新增記憶體的引用操作,在進行一次反覆mark,雖然無法通過c->b->d來掃描b和d,但是由於寫屏障的標記,我們就能將b,d這兩個殘留的白色對象進行掃描,標記為灰色, 並最終標記為黑色。

簡而言之,寫屏障的作用大致是: 可以捕獲 '沒有STW的時候並發mark期間對白色對象建立立的記憶體引用'。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.