最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言七篇入門教程七GC垃圾回收三色標(biāo)記

 更新時間:2021年11月09日 17:01:49   作者:小生凡一  
這篇文章主要為大家介紹了Go語言教程關(guān)于GC垃圾回收三色標(biāo)記的示例詳解,本篇文章是Go語言七篇入門教程系列文章,有需要的朋友可以借鑒參考下,希望能夠有所幫助

GC

GC全稱Garbage Collection

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

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

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

分為兩步:

  • 第一步找出所有的全局變量和當(dāng)前函數(shù)棧里的變量,標(biāo)記為可達。
  • 第二步,從已經(jīng)標(biāo)記的數(shù)據(jù)開始,進一步標(biāo)記它們可訪問的變量,周而復(fù)始,這一過程也叫傳遞閉包。

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

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

  • 先設(shè)置一個標(biāo)志位來記錄對象是否被使用,最開始所有的標(biāo)記位都是 0。
  • 如果發(fā)現(xiàn)對象是可達的就會置為1,一步步下去就會呈現(xiàn)一個類似樹狀的結(jié)果。
  • 等標(biāo)記的步驟完成后,會將沒有被標(biāo)記的對象統(tǒng)一清理,再次把所有的標(biāo)記位設(shè)置成 0, 以便下次進行清理。

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

三色標(biāo)記法

三色標(biāo)記法是傳統(tǒng) Mark-Sweep 的一個改進,它是一個并發(fā)的 GC 算法。on-the-fly

原理如下

整個進程空間里申請每個對象占據(jù)的內(nèi)存可以視為一個圖, 初始狀態(tài)下每個內(nèi)存對象都是白色標(biāo)記。

stop the world,將掃描任務(wù)作為多個并發(fā)的goroutine立即入隊給調(diào)度器,進而被CPU處理,第一輪先掃描所有可達的內(nèi)存對象,標(biāo)記為灰色放入隊列

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

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

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

簡化步驟如下:

請?zhí)砑訄D片描述

1、首先創(chuàng)建三個集合:白、灰、黑。

在這里插入圖片描述

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

在這里插入圖片描述

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

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

在這里插入圖片描述

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

在這里插入圖片描述

5、重復(fù) 4 直到灰色中無任何對象

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

在這里插入圖片描述

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

參考文檔:

一張圖講解GC
關(guān)于write-barrier寫屏障

以上就是Go語言七篇入門教程GC垃圾回收三色標(biāo)記的詳細內(nèi)容,更多關(guān)于Go語言GC垃圾回收三色標(biāo)記的資料請關(guān)注腳本之家其它相關(guān)文章!

如何學(xué)習(xí)Go

如果你是小白,你可以這樣學(xué)習(xí)Go語言~

七篇入門Go語言

第一篇:Go簡介初識

第二篇:程序結(jié)構(gòu)&&數(shù)據(jù)類型的介紹

第三篇:函數(shù)方法接口的介紹

第四篇:通道與Goroutine的并發(fā)編程

第五篇:文件及包的操作與處理

第六篇:網(wǎng)絡(luò)編程

相關(guān)文章

  • Go命令詳解與項目初始化(最新推薦)

    Go命令詳解與項目初始化(最新推薦)

    在Go語言(Golang)中,go命令是核心工具,用于編譯、測試、構(gòu)建、安裝和管理Go代碼,下面將詳細介紹Go命令詳解與項目初始化,感興趣的朋友跟隨小編一起看看吧
    2026-07-07
  • 詳解golang channel有無緩沖區(qū)的區(qū)別

    詳解golang channel有無緩沖區(qū)的區(qū)別

    這篇文章主要給大家介紹了golang channel有無緩沖區(qū)的區(qū)別,無緩沖是同步的,有緩沖是異步的,文中通過代碼示例給大家講解的非常詳細,需要的朋友可以參考下
    2024-01-01
  • go get 和 go install 對比介紹

    go get 和 go install 對比介紹

    go install和go get都是Go語言的工具命令,但它們之間有一些區(qū)別。go get:用于從遠程代碼存儲庫(如 GitHub)中下載或更新Go代碼包。go install:用于編譯并安裝 Go 代碼包,本文go get和go install對比介紹的非常詳細,需要的朋友可以參考一下
    2023-04-04
  • 淺析go中Ticker,Timer和Tick的用法與區(qū)別

    淺析go中Ticker,Timer和Tick的用法與區(qū)別

    在go面試的時候,面試官經(jīng)常會問time包的Ticker,Timer以及Tick的區(qū)別,一般在超時控制的時候用的比較多,今天就跟隨小編一起來詳細學(xué)一下這幾個的區(qū)別吧
    2023-10-10
  • Gin框架使用panic處理中間件問題詳解

    Gin框架使用panic處理中間件問題詳解

    這篇文章主要介紹了Gin框架使用panic處理中間件問題,在 Gin 框架中,錯誤處理和 panic 處理是非常重要的功能。當(dāng)處理 HTTP 請求時,可能會出現(xiàn)各種各樣的錯誤,例如數(shù)據(jù)庫連接錯誤、網(wǎng)絡(luò)錯誤、權(quán)限問題等等
    2023-04-04
  • Golang 實現(xiàn)Thrift客戶端連接池方式

    Golang 實現(xiàn)Thrift客戶端連接池方式

    這篇文章主要介紹了Golang 實現(xiàn)Thrift客戶端連接池方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言表達式的求值順序

    Go語言表達式的求值順序

    本文詳細講解了Go語言中的變量求值順序規(guī)則,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-06-06
  • Go結(jié)構(gòu)體SliceHeader及StringHeader作用詳解

    Go結(jié)構(gòu)體SliceHeader及StringHeader作用詳解

    這篇文章主要為大家介紹了Go結(jié)構(gòu)體SliceHeader及StringHeader作用的功能及面試官愛問的實際意義詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go數(shù)據(jù)庫遷移的實現(xiàn)步驟

    Go數(shù)據(jù)庫遷移的實現(xiàn)步驟

    本文主要介紹了Go數(shù)據(jù)庫遷移的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • golang中之strconv包的具體使用方法

    golang中之strconv包的具體使用方法

    這篇文章主要介紹了golang中之strconv包的具體使用方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10

最新評論

浪卡子县| 沾化县| 彭阳县| 南丰县| 永清县| 抚宁县| 紫金县| 安图县| 阳城县| 泸定县| 宜春市| 马龙县| 青阳县| 阳东县| 南溪县| 安岳县| 大化| 连江县| 乌鲁木齐县| 乐昌市| 武夷山市| 营山县| 连州市| 屏山县| 马尔康县| 萨迦县| 湛江市| 临澧县| 丹东市| 友谊县| 清水县| 綦江县| 无锡市| 合阳县| 镇江市| 保定市| 贵港市| 临猗县| 宜城市| 广元市| 山西省|