golang的gc

golang v1.3前-標(biāo)記清除(mark and sweep)方法

標(biāo)記清除再gc前會進(jìn)行STW,STW - MARK標(biāo)記 - SWEEP清除 - 停止STW

1、STW暫停程序業(yè)務(wù)邏輯孩饼,找出不可達(dá)對象和可達(dá)對象髓削;

2、開始標(biāo)記镀娶,程序找出所有的可達(dá)對象做上標(biāo)記立膛;

3、標(biāo)記完之后梯码,開始清楚未標(biāo)記對象宝泵;

4、停止暫停轩娶,讓程序繼續(xù)運(yùn)行鲁猩。循環(huán)重復(fù)這個過程,直到程序生命周期結(jié)束罢坝;

不足:

1廓握、STW程序暫停,程序出現(xiàn)卡頓(嚴(yán)重問題)

2嘁酿、標(biāo)記需要掃描整個heap

3隙券、清除數(shù)據(jù)會產(chǎn)生heap碎片

4、緩解辦法:可將三步和四步換位置闹司,縮短STW位置娱仔,但仍然不能解決根本問題

golang v1.5三色標(biāo)記法

go引入白色、灰色游桩、黑色標(biāo)記表

1牲迫、只要創(chuàng)建新的對象默認(rèn)顏色都標(biāo)記為白色,保存到程序中根集合(root set)

2借卧、每次gc回收開始盹憎,從跟節(jié)點開始遍歷所有對象,把遍歷到的對象從白色集合放到灰色集合

3铐刘、遍歷灰色節(jié)點陪每,將灰色對象引用的對象從白色集合放到灰色集合,之后將此灰色集合放到黑色集合

4镰吵、重復(fù)第三步檩禾,直到灰色中無任何對象

5、刪除白色標(biāo)標(biāo)記的對象疤祭,也就是gc

缺點:

下面是三色標(biāo)記法最不希望發(fā)生的事情

條件1:一個白色對象被黑色對象引用盼产、白色對象被掛在黑色對象下

條件2:灰色對象與它之間的可達(dá)關(guān)系的白色對象遭到破壞

兩個條件同時滿足時,就會出現(xiàn)對象丟失的現(xiàn)象

解決:最簡單的方式就是STW

STW的過程有明顯的資源浪費(fèi)勺馆,對所有的用戶程序都有很大影響

如何能在保證對象不丟失的情況盡可能的提高GC效率戏售,減少STW的時間呢啦辐?不能添加STW,添加就和標(biāo)記清楚沒區(qū)別了

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

不使用STW蜈项,破壞上述兩個條件:

強(qiáng)三色不允許黑色對象引用白色對象,只允許引用灰色對象(破壞條件1)

弱三色黑色對象可以引用白色對象续挟,白色對象存在其他灰色對象對它的引用紧卒,或者可達(dá)它的鏈路上游存在灰色對象(破壞條件2)

寫屏障機(jī)制:在gc過程中加入機(jī)制插入與刪除機(jī)制

插入屏障:對象被引用時觸發(fā)的機(jī)制

具體操作:A對象引用B對象的時候,B必須標(biāo)記為灰色(B掛在A的下游诗祸,B必須唄標(biāo)記為灰色)

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

為了保證效率,不在棧上設(shè)置插入屏障直颅,堆上啟用插入屏障

不足:結(jié)束是需要STW來掃描棧博个,時間大約為10~100ms

刪除屏障:對象被刪除時觸發(fā)的機(jī)制

具體操作:被刪除的對象,如果自身為灰色或者白色功偿,那么被標(biāo)記為灰色

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

不足:回收精度低盆佣,一個對象即時被刪除了最后一個指向它的指針也依舊可以活過這一輪,在下一輪GC中被清除

golang v1.8的三色標(biāo)記法+混合寫屏障機(jī)制

1械荷、GC開始將棧上的對象全部掃描并標(biāo)記為黑色(之后不再進(jìn)行第二次重復(fù)掃描共耍,無需STW)

2、GC期間吨瞎,任何在棧上創(chuàng)建的對象痹兜、均為黑色

3、被刪除的對象標(biāo)記為灰色

4颤诀、被添加的對象標(biāo)記為灰色

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末字旭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崖叫,更是在濱河造成了極大的恐慌遗淳,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件心傀,死亡現(xiàn)場離奇詭異洲脂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)剧包,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門恐锦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疆液,你說我怎么就攤上這事一铅。” “怎么了堕油?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵潘飘,是天一觀的道長肮之。 經(jīng)常有香客問我,道長卜录,這世上最難降的妖魔是什么戈擒? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮艰毒,結(jié)果婚禮上筐高,老公的妹妹穿的比我還像新娘。我一直安慰自己丑瞧,他們只是感情好柑土,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绊汹,像睡著了一般稽屏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上西乖,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天狐榔,我揣著相機(jī)與錄音,去河邊找鬼获雕。 笑死荒叼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的典鸡。 我是一名探鬼主播被廓,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼萝玷!你這毒婦竟也來了嫁乘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤球碉,失蹤者是張志新(化名)和其女友劉穎蜓斧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睁冬,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡挎春,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了豆拨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片直奋。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖施禾,靈堂內(nèi)的尸體忽然破棺而出脚线,到底是詐尸還是另有隱情,我是刑警寧澤弥搞,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布邮绿,位于F島的核電站渠旁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏船逮。R本人自食惡果不足惜顾腊,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挖胃。 院中可真熱鬧杂靶,春花似錦、人聲如沸冠骄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凛辣。三九已至,卻和暖如春职烧,著一層夾襖步出監(jiān)牢的瞬間扁誓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工蚀之, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蝗敢,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓足删,卻偏偏與公主長得像寿谴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子失受,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容