Go語言采用了3色標(biāo)記清理法來對內(nèi)存進(jìn)行自動垃圾回收,
過程是這樣的:
(1)起初所有的對象都是白色的;
(2)從根對象出發(fā)掃描所有可達(dá)對象,標(biāo)記為灰色,放入待處理隊列;
(3)從待處理隊列中取出灰色對象,將其引用的對象標(biāo)記為灰色并放入待處理隊列中,自身標(biāo)記為黑色;
(4)重復(fù)步驟(3),直到待處理隊列為空,此時白色對象即為不可達(dá)的“垃圾”,回收白色對象;
相比Java中的很多垃圾回收方法,Go的標(biāo)記清理有很大不同,Go中沒有劃分代的概念。
為什么標(biāo)記階段需要STW呢?
其中,標(biāo)記動作,是需要進(jìn)行STW的,標(biāo)記結(jié)束之后,關(guān)閉STW。為什么這么設(shè)計呢?
三色標(biāo)記法不使用STW的時候有可能會出現(xiàn):在結(jié)束某處的掃描后,新加入的依賴對象初始化為白色,會被直接清理掉。為了防止清理無辜對象,需要引入STW。
什么是根引用對象?
Go 程序的根節(jié)點(diǎn)通常包括以下幾類對象:
- 程序的全局變量和靜態(tài)變量:這些變量在整個程序執(zhí)行過程中都可以被訪問到,因此垃圾回收器會將它們作為根節(jié)點(diǎn)。
- 程序的調(diào)用棧中的變量:這些變量在函數(shù)調(diào)用過程中被創(chuàng)建,并在函數(shù)返回時被銷毀。因此,在函數(shù)調(diào)用期間,它們被認(rèn)為是根節(jié)點(diǎn)。
- 當(dāng)前執(zhí)行的Goroutine:在 Go 語言中,Goroutine 是輕量級的線程,它們可以獨(dú)立地運(yùn)行,因此當(dāng)前執(zhí)行的Goroutine也被認(rèn)為是根節(jié)點(diǎn)。
什么是強(qiáng)弱三色不變式
強(qiáng)弱三色不變式的目標(biāo)是保持以下兩個性質(zhì):文章來源:http://www.zghlxwxcb.cn/news/detail-650994.html
- 強(qiáng)三色不變式(Strong Tri-Color Invariant):在任何時刻,灰色對象不會直接或間接引用白色對象。這意味著垃圾回收器不會遺漏任何可達(dá)的對象。
- 弱三色不變式(Weak Tri-Color Invariant):在垃圾回收的過程中,黑色對象不會再次引用白色對象。這樣可以確保垃圾回收器不會將已經(jīng)回收的對象誤認(rèn)為存活對象。
通過維護(hù)這兩個不變式,垃圾回收器可以正確地標(biāo)記和清除不再使用的對象,同時避免將存活對象錯誤地回收。文章來源地址http://www.zghlxwxcb.cn/news/detail-650994.html
到了這里,關(guān)于為什么這么設(shè)計—— Go的GC的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!