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

詳解Golang的GC三色標(biāo)記法

 更新時間:2023年05月16日 09:54:33   作者:wangxiaoangg  
這篇文章主要為大家介紹了Golang的GC三色標(biāo)記法,文中有詳細(xì)的實現(xiàn)過程供大家參考,對大家的學(xué)習(xí)或工作有一定幫助,感興趣的可以跟著小編一來看看

一 概念基礎(chǔ)

1.1三色標(biāo)記法將對象分為三類

把圖過程中遇到的對象,按“是否訪問過”這個條件標(biāo)記成以下三種顏色:

白色對象(可能死亡):未被回收器訪問到的對象。在回收開始階段,所有對象均為白色,當(dāng)回收結(jié)束后,白色對象均不可達(dá)。

灰色對象(波面):已被回收器訪問到的對象,但回收器需要對其中的一個或多個指針進(jìn)行掃描,因為他們可能還指向白色對象。

黑色對象(確定存活):已被回收器訪問到的對象,其中所有字段都已被掃描,黑色對象中任何一個指針都不可能直接指向白色對象。

1.2 標(biāo)記過程

  • 起初所有的對象都是白色的;
  • 從根對象出發(fā)掃描所有可達(dá)對象,標(biāo)記為灰色,放入待處理隊列;
  • 從待處理隊列中取出灰色對象,將其引用的對象標(biāo)記為灰色并放入待處理隊列中,自身標(biāo)記為黑色;
  • 重復(fù)步驟3,直到待處理隊列為空,此時白色對象即為不可達(dá)的“垃圾”,回收白色對象;
  • 回收所有的白色對象,也就是回收垃圾

根對象

在垃圾回收的術(shù)語中又叫做根集合,它是垃圾回收器在標(biāo)記過程時最先檢查的對象。

  • 全局變量:程序在編譯期就能確定的那些存在于程序整個生命周期的變量。
  • 執(zhí)行棧:每個 goroutine 都包含自己的執(zhí)行棧,這些執(zhí)行棧上包含棧上的變量及指向分配的堆內(nèi)存區(qū)塊的指針。
  • 寄存器:寄存器的值可能表示一個指針,參與計算的這些指針可能指向某些賦值器分配的堆內(nèi)存區(qū)塊。

1.3 STW

STW(Stop The World)機(jī)制是指在進(jìn)行垃圾回收時,會暫停應(yīng)用程序的運行,以便進(jìn)行垃圾回收操作。這意味著在進(jìn)行垃圾回收時,應(yīng)用程序?qū)o法繼續(xù)執(zhí)行。

為什么需要STW

STW(Stop-The-World)機(jī)制來確保并發(fā)操作的正確性。

如果不設(shè)置STW機(jī)制,那么在進(jìn)行GC時,應(yīng)用程序線程可能會繼續(xù)執(zhí)行,從而導(dǎo)致內(nèi)存管理的不一致性和錯誤。此外,GC可能會導(dǎo)致內(nèi)存分配和釋放的不連續(xù),從而導(dǎo)致內(nèi)存碎片化問題。

因此,需要STW機(jī)制來確保GC的正確性和內(nèi)存管理的一致性。雖然STW機(jī)制會導(dǎo)致一定的性能損失,但是這是必要的代價,以確保應(yīng)用程序的正確性和穩(wěn)定性。

1.4 屏障機(jī)制

1.4.1強(qiáng)、弱三色不變式

強(qiáng)三色不變式:強(qiáng)制性的不允許黑色對象引用白色對象,只能引用灰色對象,這樣就不會出現(xiàn)白色對象被誤刪的情況。

弱三色不等式 :
保護(hù)灰色對象到白色對象的路徑不會斷;

黑色對象可以引用白色對象,白色對象存在其他灰色對象對它的引用。
或可達(dá)它的鏈路上游存在灰色對象。這樣實則是黑色對象引用白色對象,白色對象處于一個被刪除的狀態(tài),但是上游灰色對象的引用,可以保護(hù)白色對象,使其安全。

為了遵循上述兩種方式,GC算法演進(jìn)到兩種屏障方式,“插入屏障”和“刪除屏障”。

1.4.2 插入屏障

在A對象引用B對象時,B對象被標(biāo)記為灰色。(將B掛在A下游,B必須被標(biāo)記為灰色)

滿足強(qiáng)三色不等式。

插入屏障機(jī)制在棧空間的對象操作不使用,僅僅使用在堆空間對象的操作中。

1.4.3 刪除屏障

被刪除的對象,如果本身為灰色或白色,那么標(biāo)記為灰色。

滿足弱三色不等式。

1.4.4 混合屏障

插入寫屏障和刪除寫屏障的缺點:

  • 插入寫屏障:結(jié)束時需要STW來重新掃描棧,標(biāo)記棧上引用的白色對象存活
  • 刪除寫屏障:回收精度低,GC開始時STW掃描堆棧來記錄快照,這個過程會保護(hù)開始時刻的所有的存活對象。

Go1.8引入混合寫屏障機(jī)制,避免了對棧的重復(fù)掃描過程,極大減少了STW的時間。

  • GC開始將棧上的對象全部掃描并標(biāo)記為黑色(之后不再進(jìn)行第二次重復(fù)掃描,無需STW)
  • GC期間,任何在棧上創(chuàng)建的新對象,都標(biāo)記為黑色
  • 被刪除的對象標(biāo)記為灰色
  • 被添加的對象標(biāo)記為灰色

二 GC過程

2.1 階段1:Mark Setup 標(biāo)記準(zhǔn)備

為了打開寫屏障,必須停止每個goroutine,讓垃圾收集器觀察并等待每個goroutine進(jìn)行函數(shù)調(diào)用,等待函數(shù)調(diào)用是為了保證goroutine停止時處于安全點。(期間會STW)

2.2 階段2:Marking 標(biāo)記

一旦寫屏障打開,垃圾收集器就開始標(biāo)記階段。

標(biāo)記階段需要標(biāo)記在堆內(nèi)存中仍然在使用中的值。首先檢查所有現(xiàn)goroutine的堆棧,以找到堆內(nèi)存的根指針。然后收集器必須從那些根指針遍歷堆內(nèi)存圖,標(biāo)記可以回收的內(nèi)存。

當(dāng)存在新的內(nèi)存分配時,會暫停分配內(nèi)存過快的那些 goroutine,并將其轉(zhuǎn)去執(zhí)行一些輔助標(biāo)記(Mark Assist)的工作,從而達(dá)到放緩繼續(xù)分配、輔助 GC 的標(biāo)記工作的目的。

2.3階段3:Mark Termination 標(biāo)記結(jié)束

這個階段會關(guān)閉掉階段1開啟的屏障,并計算下一次清理的目標(biāo)和計劃。(本階段會STW)

2.4 階段4:Sweeping 清理

清理階段用于回收標(biāo)記階段中標(biāo)記出來的可回收內(nèi)存。當(dāng)應(yīng)用程序goroutine嘗試在堆內(nèi)存中分配新內(nèi)存時,會觸發(fā)該操作,清理導(dǎo)致的延遲和吞吐量降低被分散到每次內(nèi)存分配時。

本階段會并發(fā)執(zhí)行,清除前面標(biāo)記出來需清理的內(nèi)存。

以上就是詳解Golang的GC三色標(biāo)記法的詳細(xì)內(nèi)容,更多關(guān)于Golang GC 三色標(biāo)記法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • goland?-sync/atomic原子操作小結(jié)

    goland?-sync/atomic原子操作小結(jié)

    這篇文章主要介紹了goland?-sync/atomic原子操作,原子操作能夠保證執(zhí)行期間是連續(xù)且不會被中斷(變量不會被其他修改,mutex可能存在被其他修改的情況),本文給大家介紹的非常詳細(xì),需要的朋友參考下
    2022-08-08
  • Go可變參數(shù)函數(shù)的實現(xiàn)

    Go可變參數(shù)函數(shù)的實現(xiàn)

    可變參數(shù)函數(shù)是指函數(shù)參數(shù)的某個參數(shù)可有可無,即這個參數(shù)的個數(shù)可以為0會多個,可變參數(shù)函數(shù)參數(shù)在日常編程中大量使用,本文主要介紹了Go可變參數(shù)函數(shù)的實現(xiàn),感興趣的可以了解一下
    2023-12-12
  • Go設(shè)計模式之迭代器模式講解和代碼示例

    Go設(shè)計模式之迭代器模式講解和代碼示例

    迭代器是一種行為設(shè)計模式, 讓你能在不暴露復(fù)雜數(shù)據(jù)結(jié)構(gòu)內(nèi)部細(xì)節(jié)的情況下遍歷其中所有的元素,本文將為大家詳細(xì)介紹Go 迭代器模式,文中詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-07-07
  • Go語言基礎(chǔ)go install命令使用示例詳解

    Go語言基礎(chǔ)go install命令使用示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)go install命令的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • GoLang之使用Context控制請求超時的實現(xiàn)

    GoLang之使用Context控制請求超時的實現(xiàn)

    這篇文章主要介紹了GoLang之使用Context控制請求超時的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Golang 關(guān)于Gin框架請求參數(shù)的獲取方法

    Golang 關(guān)于Gin框架請求參數(shù)的獲取方法

    Gin是Go語言的Web框架,提供路由和中間件支持,本文介紹如何使用Gin獲取HTTP請求參數(shù),包括URLPath參數(shù)、URLQuery參數(shù)、HTTPBody參數(shù)和Header參數(shù),詳解直接獲取和綁定到結(jié)構(gòu)體兩種方法,幫助開發(fā)者高效處理Web請求
    2024-10-10
  • Go語言LeetCode題解706設(shè)計哈希映射

    Go語言LeetCode題解706設(shè)計哈希映射

    這篇文章主要為大家介紹了Go語言LeetCode題解706設(shè)計哈希映射示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Golang內(nèi)存管理之垃圾收集器詳解

    Golang內(nèi)存管理之垃圾收集器詳解

    這篇文章我們主要介紹垃圾收集器的設(shè)計原理以及Golang垃圾收集器的實現(xiàn)原理,文中有詳細(xì)的代碼示例及圖文介紹,感興趣的小伙伴跟著小編一起來學(xué)習(xí)吧
    2023-06-06
  • go性能分析工具pprof的用途及使用詳解

    go性能分析工具pprof的用途及使用詳解

    剛開始接觸go就遇到了一個內(nèi)存問題,在進(jìn)行內(nèi)存分析的時候發(fā)現(xiàn)了一下比較好的工具,在此留下記錄,下面這篇文章主要給大家介紹了關(guān)于go性能分析工具pprof的用途及使用的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 基于Go+WebSocket實現(xiàn)實時通信功能

    基于Go+WebSocket實現(xiàn)實時通信功能

    在互聯(lián)網(wǎng)應(yīng)用程序中,實時通信是一種非常重要的功能,WebSocket 是一種基于 TCP 的協(xié)議,它允許客戶端和服務(wù)器之間進(jìn)行雙向通信,本文將介紹如何使用 Golang 創(chuàng)建單獨的 WebSocket 會話,以實現(xiàn)實時通信功能,需要的朋友可以參考下
    2023-10-10

最新評論

新丰县| 乐山市| 通榆县| 辉县市| 大荔县| 闻喜县| 铜山县| 大冶市| 庆元县| 武城县| 宜阳县| 罗江县| 南雄市| 青浦区| 朝阳县| 吴旗县| 从化市| 高唐县| 大名县| 江川县| 修水县| 拜城县| 温宿县| 登封市| 富源县| 平泉县| 白沙| 南岸区| 泰安市| 平罗县| 两当县| 商水县| 加查县| 新乡市| 四川省| 台中市| 岳阳市| 高台县| 余姚市| 安庆市| 韶山市|