91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

GC垃圾回收的三色標記是什么

發布時間:2022-03-11 17:08:55 來源:億速云 閱讀:234 作者:iii 欄目:開發技術

這篇文章主要介紹“GC垃圾回收的三色標記是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“GC垃圾回收的三色標記是什么”文章能幫助大家解決問題。

GC

GC全稱Garbage Collection

目前主流的垃圾回收算法有兩類,分別是追蹤式垃圾回收算法(Tracing garbage collection)和引用計數法( Reference counting )。
而三色標記法是屬于追蹤式垃圾回收算法的一種。

追蹤式算法的核心思想是判斷一個對象是否可達,因為一旦這個對象不可達就可以立刻被 GC 回收了。

如何判斷一個對象是否可達

分為兩步:

  • 第一步找出所有的全局變量和當前函數棧里的變量,標記為可達。

  • 第二步,從已經標記的數據開始,進一步標記它們可訪問的變量,周而復始,這一過程也叫傳遞閉包

在go推出三色標記法之前,go所使用的gc算法叫Mark-And-Sweep(標記清掃)

這個算法就是嚴格按照追蹤式算法的思路來實現的。

  • 先設置一個標志位來記錄對象是否被使用,最開始所有的標記位都是 0。

  • 如果發現對象是可達的就會置為1,一步步下去就會呈現一個類似樹狀的結果。

  • 等標記的步驟完成后,會將沒有被標記的對象統一清理,再次把所有的標記位設置成 0, 以便下次進行清理。

這個算法最大的問題是 GC 執行期間需要把整個程序完全暫停,不能異步進行GC操作。因為在不同階段標記清掃法的標志位 0 和 1 有不同的含義,那么新增的對象無論標記為什么都有可能意外刪除這個對象。對實時性要求高的系統來說,這種需要長時間掛起的標記清掃法是不可接受的。所以就需要一個算法來解決 GC 運行時程序長時間掛起的問題,那就三色標記法。

三色標記法

三色標記法是傳統 Mark-Sweep 的一個改進,它是一個并發的 GC 算法。on-the-fly

原理如下

整個進程空間里申請每個對象占據的內存可以視為一個圖, 初始狀態下每個內存對象都是白色標記。

stop the world,將掃描任務作為多個并發的goroutine立即入隊給調度器,進而被CPU處理,第一輪先掃描所有可達的內存對象,標記為灰色放入隊列

第二輪可以恢復start the world,將第一步隊列中的對象引用的對象置為灰色加入隊列,一個對象引用的所有對象都置灰并加入隊列后,這個對象才能置為黑色并從隊列之中取出。循環往復,最后隊列為空時,整個圖剩下的白色內存空間即不可到達的對象,即沒有被引用的對象;

第三輪再次stop the world,將第二輪過程中新增對象申請的內存進行標記(灰色),這里使用了writebarrier(寫屏障)去記錄這些內存的身份;

這個算法可以實現 on-the-fly,也就是在程序執行的同時進行收集,并不需要暫停整個程序。

簡化步驟如下:

GC垃圾回收的三色標記是什么

1、首先創建三個集合:白、灰、黑。

GC垃圾回收的三色標記是什么

2、將所有對象放入白色集合中。

GC垃圾回收的三色標記是什么

3、然后從根節點開始遍歷所有對象(注意這里并不遞歸遍歷),把遍歷到的對象從白色集合放入灰色集合。

因為root set 指向了A、F,所以從根結點開始遍歷的是A、F,所以是把A、F放到灰色集合中。

GC垃圾回收的三色標記是什么

4、之后遍歷灰色集合,將灰色對象引用的對象從白色集合放入灰色集合,之后將此灰色對象放入黑色集合
我們可以發現這個A指向了B,C,D所以也就是把BCD放到灰色中,把A放到黑色中,而F沒有指任何的對象,所以直接放到黑色中。

GC垃圾回收的三色標記是什么

5、重復 4 直到灰色中無任何對象

因為D指向了A所以D也放到了黑色中,而B和C能放到黑色集合中的道理和F一樣,已經沒有了可指向的對象了。

GC垃圾回收的三色標記是什么

6、通過write-barrier檢測對象有無變化,重復以上操作

由于這個EGH并沒有和RootSet有直接或是間接的關系,所以就會被清除。

GC垃圾回收的三色標記是什么

7、收集所有白色對象(垃圾)

GC垃圾回收的三色標記是什么

所以我們可以看出這里的情況,只要是和root set根集合直接相關的對象或是間接相關的對象都不會被清楚。只有不相關的才會被回收。

關于“GC垃圾回收的三色標記是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

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

gc
AI

监利县| 盱眙县| 遂溪县| 阜南县| 庆元县| 鞍山市| 竹北市| 柳江县| 井陉县| 凭祥市| 博客| 遂平县| 通州区| 华容县| 沙湾县| 丰镇市| 诏安县| 开阳县| 曲麻莱县| 奇台县| 阳高县| 泊头市| 桦川县| 淳安县| 汪清县| 辉南县| 金平| 乐至县| 新野县| 宝清县| 通道| 云浮市| 灵宝市| 固阳县| 谷城县| 民和| 新宁县| 肃北| 广汉市| 林西县| 即墨市|