中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang垃圾回收中如何實現刪除寫屏障

發布時間:2021-12-15 10:09:21 來源:億速云 閱讀:397 作者:小新 欄目:云計算

這篇文章將為大家詳細講解有關golang垃圾回收中如何實現刪除寫屏障,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

首先聲明,golang 沒有直接實現過刪除寫屏障,golang 的內存寫屏障是由插入寫屏障到混合寫屏障過渡的。不過,雖然 golang 從來沒有直接使用刪除寫屏障,但是混合寫屏障卻用到了刪除寫屏障的思路。

刪除寫屏障:也叫做基于其實快照的解決方案(snapshot-at-the-begining)。顧名思義,就是在開始 gc 之前,必須 STW ,對整個根做一次起始快照。當賦值器(業務線程)從灰色或者白色對象中刪除白色指針時候,寫屏障會捕捉這一行為,將這一行為通知給回收器。這樣,基于起始快照的解決方案保守地將其目標對象當作存活的對象,這樣就絕對不會有被誤回收的對象,但是有掃描工作量浮動放大的風險。術語叫做追蹤波面的回退。

刪除寫屏障(基于起始快照的寫屏障)有一個前提條件,就是起始的時候,把整個根部掃描一遍,讓所有的可達對象全都在灰色保護下(根黑,下一級在堆上的全灰),之后利用刪除寫屏障捕捉內存寫操作,確保弱三色不變式不被破壞,就可以保證垃圾回收的正確性。

偽代碼如下:

atomic Write(src, i, ref)    shade(src[i])    src[i] <- ref
 

復習一下一些概念

賦值器的顏色

  • 灰色賦值器:如果某一個賦值器尚未被回收器掃描過(即賦值器的根還沒有被追蹤到),或者盡管被掃描過,但是還需要重新掃描
    • golang 插入寫屏障的時期,就是灰色賦值器
  • 黑色賦值器:已經被回收器掃描過,不會再對其進行掃描

插入寫屏障對應的是灰色賦值器,刪除寫屏障對應的是黑色賦值器。

三色不變式

  • 強三色:不允許黑色對象指向白色對象
  • 弱三色:允許黑色對象指向白色對象,但必須保證一個前提,這個白色對象必須處于灰色對象的保護下

強三色不變式的框架下:要求黑色賦值器的根只能引用灰色或者黑色對象,不能引用白色對象(因為黑色賦值器不再被掃描,引用白色)。

弱三色不變式的框架下:允許黑色賦值器的根引用白色對象,但前提是白色對象必須處于灰色保護下。

獲取賦值器的快照,意味著回收器需要掃描其根并將其置為黑色。我們必須在回收起始階段完成賦值器快照的獲取,并保證其不持有任何白色對象。否則一旦賦值器持有某白色對象的唯一引用并將其寫入黑色對象,然后再拋棄該指針,則會違背弱三色不變式的要求。當然,為黑色對象增加寫屏障可以捕捉這一內存寫操作,但如此一來,該方案將退化到強三色不變式的框架下。因此,基于其實快照的解決方案將只允許黑色賦值器的存在。

刪除寫屏障怎么保證弱三色不變式,如下示意圖:

golang垃圾回收中如何實現刪除寫屏障
 

 

我們看到第三張圖顯示,黑色指向白色沒問題,只要最后 delete 指針的時候 Z 對象置灰色,那么回收的正確性就可以保證。

關于“golang垃圾回收中如何實現刪除寫屏障”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定南县| 玛曲县| 景宁| 响水县| 于都县| 福建省| 远安县| 萍乡市| 洪洞县| 安顺市| 石狮市| 宣恩县| 策勒县| 商水县| 琼结县| 高碑店市| 闽清县| 嘉禾县| 平远县| 中西区| 灵武市| 伊吾县| 九龙城区| 南和县| 平安县| 久治县| 越西县| 湛江市| 莱芜市| 抚州市| 阳原县| 南涧| 宜章县| 庆安县| 搜索| 广饶县| 广河县| 临颍县| 中超| 施甸县| 鄂伦春自治旗|