日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go语言垃圾回收(GC)

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go语言垃圾回收(GC) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. Go V1.3之前的標記清除(mark and sweep)

1. 1 標記清除法的基本流程

第一步 : STW(stop the world)暫停所有的程序業務邏輯, 找出可達對象和不可達對象(程序調用對象)

第二步 : 開始標記, 程序找出他所有的可達對象并進行標記

第三步 : 清除所有不可達對象, 就是未標記的對象

第四步 : 停止暫停, 讓程序繼續跑, 然后重復這個過程, 直到程序結束

1. 2 標記清除的缺點

  • STW, 會讓程序變慢
  • 標機過程需要將全部的堆棧進行一遍掃描來確定是不是可達對象
  • 刪除的過程中, 會產生heap碎片

2. Go V 1.5 三色標記法

2. 1三色標記法的基本流程

三種顏色 白色, 灰色, 黑色. 總圖在這

  • 第一步首先將所有對象加入白色標記表中
  • 第二步 : 將程序不依靠指針能夠找到的所有對象標為灰色, 并在白色表中將這些節點刪除
  • 第三步 : 遍歷灰色表中的節點, 將表中灰色節點能找到的白色節點標為灰色, 并且將原先的灰色節點標為黑色
  • 第四步 : 重復進行第三步的步驟直至所有的灰色節點都變為了黑色節點, 那么白色的節點就是要刪除的節點
  • 2. 2 如果沒有STW保護的三色標記法會出什么問題呢 ?

    假如沒有STW的保護, 那么我們在標記和程序運行的過程中, 其實這兩個過程是并行發生的.
    那么會不會發生如下情況

    那么當我們遍歷到對象2時, 對象3就無法被標記為灰色對象了. 因為我們是不會再去遍歷黑色的對象. 那么此時對象3就會被誤當為垃圾對象給處理了

    所以這是golang中三色標記法最不愿意看到的一幕


    如果上述兩個條件都滿足了, 那么很有可能發生對象丟失!!!
    那么該如何解決呢 ?
    其實最簡單的方法就是加STW
    但是STW對于程序有很大的資源浪費.
    那么如何保證有效執行GC期間又減少STW的時間來加快效率呢
    我們首先介紹一下強弱三色不變式, 再來介紹如何解決這個問題

    2. 3 強弱三色不變式

    只要解決上述兩個問題, 那么就可以保證對象不被丟失.

    所以Google提出了兩種方法
    只要讓上面兩個條件不滿足一個即可

  • 強三色不變式
    一個白色的條件不允許掛在黑色條件下
  • 弱三色不變式
    黑色條件下可以掛白色條件但是白色條件要能被找到 (意思就是白色條件要被灰色條件所指向, 或者是在白色條件的鏈路上游能找到灰色條件)
  • 3. 屏障法(用來滿足強弱三色不變式)

    3. 1 插入屏障

    具體操作: 在A對象引用B對象的時候,B對象被標記為灰色。(將B掛在A下游,B必須被標記為灰色)

    滿足: 強三色不變式. (不存在黑色對象引用白色對象的情況了, 因為白色會強制變成灰色)

    我們知道,黑色對象的內存槽有兩種位置, 棧和堆.
    棧空間的特點是容量小,但是要求相應速度快,因為函數調用彈出頻繁使用, 所以“插入屏障”機制,在棧空間的對象操作中不使用. 而僅僅使用在堆空間對象的操作中使用.

    ? 接下來,我們用幾張圖,來模擬整個一個詳細的過程, 希望您能夠更可觀的看清晰整體流程。

    插入屏障的缺點

    還是需要STW的加入, 對程序資源消耗大, 但是相對于之前的全局STW, 那又小了很多

    3. 2 刪除屏障

    具體操作: 開始時, 利用快照的方式, 需要進行STW, 然后被刪除的對象,如果自身為灰色或者白色,那么被標記為灰色。

    滿足: 弱三色不變式. (保護灰色對象到白色對象的路徑不會斷)

    刪除屏障的缺點

    如上圖所示, 對象1刪除了對于對象5的引用, 所以對象5被標記為了灰色, 最后的又被標記為了黑色, 那么他不是沒有被刪除了嗎 ?
    實際上這就是刪除屏障的缺點 :
    這種方式的回收精度低,一個對象即使被刪除了最后一個指向它的指針也依舊可以活過這一輪,在下一輪GC中被清理掉。
    但是這個對象就是會在下一輪GC中被刪除

    4. Go V1.8 混合寫屏障

    具體操作:

    1、GC開始將棧上的可達對象全部掃描并標記為黑色(之后不再進行第二次重復掃描,無需STW),

    2、GC期間,任何在棧上創建的新對象,均為黑色。

    3、被刪除的對象標記為灰色。

    4、被添加的對象標記為灰色。

    滿足: 變形的弱三色不變式.

    這里我們注意, 屏障技術是不在棧上應用的,因為要保證棧的運行效率。
    混合寫屏障是GC的一種屏障機制,所以只是當程序執行GC的時候,才會觸發這種機制。

    ? Golang中的混合寫屏障滿足弱三色不變式,結合了刪除寫屏障和插入寫屏障的優點.
    只需要在開始時并發掃描各個goroutine的棧,使其變黑并一直保持,這個過程不需要STW.
    而標記結束后,因為棧在掃描后始終是黑色的,也無需再進行re-scan操作了,減少了STW的時間。

    5. 總結

    GoV1.3- 普通標記清除法,整體過程需要啟動STW,效率極低。

    GoV1.5- 三色標記法, 堆空間啟動寫屏障,棧空間不啟動,全部掃描之后,需要重新掃描一次棧(需要STW),效率普通

    GoV1.8-三色標記法,混合寫屏障機制, 棧空間不啟動,堆空間啟動。整個過程幾乎不需要STW,效率較高。

    6. 現代GC流程

    標記之前和標記完成之后需要進行短暫的STW. 來開啟和終止寫屏障

    總結

    以上是生活随笔為你收集整理的Go语言垃圾回收(GC)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美日韩黄色大片 | www.成人在线视频 | 黄色网址免费 | 九色91在线 | 他趴在我两腿中间添得好爽在线看 | 一级黄色免费视频 | 欧美精品一区在线发布 | 日本一区二区成人 | 日韩亚洲一区二区三区 | 日韩精品一区二区av | 日本成人精品视频 | 台湾佬美性中文娱乐网 | 亚洲一区二区在线免费观看 | 日本国产三级xxxxxx | 色一五月| 久久免费毛片 | 午夜免费在线观看 | 色97色| 全黄一级裸体片 | 男人午夜网站 | 亚洲一区二区三区电影在线观看 | 熟妇人妻中文字幕 | 亚洲AV无码一区二区三区性 | 女儿的朋友5中汉字晋通话 欧美成人免费高清视频 | 五月婷婷色 | www夜夜| 91精品国产99久久久久久红楼 | 成人在线播放av | 久久婷婷六月 | 欧美精品日韩精品 | xxx麻豆| 日韩一区免费观看 | 变态 另类 国产 亚洲 | 女人脱下裤子让男人桶 | 香蕉伊思人视频 | 亚洲精品高清视频在线观看 | 国产精品一区视频 | 国产浮力第一页 | 摸摸摸bbb毛毛毛片 午夜爽爽影院 | 在线观看黄色小视频 | 国产交换配乱淫视频免费 | 久久精品国产亚洲AV高清综合 | 性生活av | 超级黄色片 | 性淫影院| 欧美日韩激情视频 | 中文字幕在线天堂 | 男人的天堂2019 | 国产精品国色综合久久 | 欧美乱三级 | 奇米影视第四色777 波多野结衣一区二区三区免费视频 | 亚洲大成色| 一级片久久久久 | 亚洲激情欧美激情 | 又黄又色的网站 | 成人看片 | 国产精品一区二区无线 | 欧洲亚洲综合 | 国产成人av免费 | 久久99精品国产.久久久久久 | 日韩精品美女 | 日日骚一区二区 | 日本三级韩国三级三级a级中文 | 在线视频三区 | 波多野结衣av在线观看 | 国产一级做a爰片在线看免费 | 中国少妇乱子伦视频播放 | 免费观看在线视频 | 97网站| 国产在线观看黄 | 黄色片播放器 | 国产精品久久久久久网站 | 亚洲伦理在线播放 | 久久国产精品免费看 | 久久久午夜精品福利内容 | 你懂的91| 久久久久免费精品 | 日韩成人免费电影 | 青青青草视频 | 高h喷水荡肉少妇爽多p视频 | 网站免费在线观看 | 中文无码熟妇人妻av在线 | 99精品在线免费观看 | 亚洲妇女体内精汇编 | 欧美一级爽aaaaa大片 | 91超碰在线观看 | 99999精品视频 | 91麻豆影视 | 免费在线看黄网址 | 日本色视 | 午夜影视av | 能直接看的av网站 | 日韩深夜福利 | 欧美日色| 久久久久九九九九 | 国产av无码专区亚洲a∨毛片 | 精品福利一区二区 | 婷婷视频网 | 日本一级吃奶淫片免费 |