golang的垃圾回收(GC)機(jī)制

請(qǐng)先閱讀 golang的goroutine調(diào)度機(jī)制

golang的垃圾回收采用的是 標(biāo)記-清理(Mark-and-Sweep) 算法
就是先標(biāo)記出需要回收的內(nèi)存對(duì)象快苇倡,然后在清理掉;
在這里不介紹標(biāo)記和清理的具體策略,只介紹 GC過(guò)程是怎么調(diào)度的以及stw相關(guān)
這個(gè)算法陨帆,會(huì)導(dǎo)致 stw (stop the world) 的問(wèn)題锈颗,中斷用戶邏輯

觸發(fā)GC機(jī)制

  • 在申請(qǐng)內(nèi)存的時(shí)候,檢查當(dāng)前當(dāng)前已分配的內(nèi)存是否大于上次GC后的內(nèi)存的2倍炼团,若是則觸發(fā)(主GC線程為當(dāng)前M)

  • 監(jiān)控線程發(fā)現(xiàn)上次GC的時(shí)間已經(jīng)超過(guò)兩分鐘了澎嚣,觸發(fā);將一個(gè)G任務(wù)放到全局G隊(duì)列中去瘟芝。(主GC線程為執(zhí)行這個(gè)G任務(wù)的M)

每當(dāng)觸發(fā)的時(shí)候易桃,在主GC線程中就會(huì)走如下的GC流程:

  • stop the world,等待所有的M休眠模狭;此時(shí)所有的業(yè)務(wù)邏輯代碼都停止

  • 標(biāo)記:分配gc標(biāo)記任務(wù)颈抚,喚醒 gcproc個(gè) M(就是第一步休眠的那些),分別做這個(gè)嚼鹉,直到所有的M都做完贩汉,才結(jié)束;并且所有M再次進(jìn)入休眠

  • 清理:有一個(gè)單獨(dú)的goroutine去清理已經(jīng)標(biāo)記的內(nèi)存對(duì)象快

  • start the world锚赤,設(shè)置gcwaiting=0匹舞,喚醒所有的M(不會(huì)超過(guò)P個(gè)數(shù))

對(duì)于上面的三個(gè)步驟,分別解釋:

Stop the world:

  • 設(shè)置gcwaiting=1线脚,這個(gè)在每一個(gè)G任務(wù)之前會(huì)檢查一次這個(gè)狀態(tài)赐稽,如是,則會(huì)將當(dāng)前M 休眠浑侥;

  • 如果這個(gè)M里面正在運(yùn)行一個(gè)長(zhǎng)時(shí)間的G任務(wù)姊舵,咋辦呢,難道會(huì)等待這個(gè)G任務(wù)自己切換嗎寓落?這樣的話可要等10ms啊括丁,不能等!堅(jiān)決不能等伶选! 所以會(huì)主動(dòng)發(fā)出搶占標(biāo)記(類似于上一篇)史飞,讓當(dāng)前G任務(wù)中斷尖昏,再運(yùn)行下一個(gè)G任務(wù)的時(shí)候,就會(huì)走到第1步

  • 一直等待所有的M進(jìn)入休眠构资,此時(shí)所有的業(yè)務(wù)邏輯代碼都停止

標(biāo)記:

  • 根據(jù)gcproc的個(gè)數(shù)抽诉,分配成gcproc任務(wù)段;喚醒gcproc-1 個(gè)M來(lái)執(zhí)行(當(dāng)前M也算一個(gè))

  • 對(duì)于一個(gè)M吐绵,喚醒前設(shè)置它的helpgc標(biāo)記迹淌,喚醒之后這個(gè)M會(huì)立馬判斷這個(gè)標(biāo)記,如是拦赠,則開始做分配給自己的標(biāo)記任務(wù)巍沙,如果先做完了,就會(huì)從別的M里面找一些來(lái)做

  • 等每一個(gè)M都做完荷鼠,會(huì)再次進(jìn)入休眠

清理:

  • 通過(guò)設(shè)置參數(shù)句携,可以以一個(gè)單獨(dú)goroutine 運(yùn)行,這個(gè)功能是在1.3版本之后增加的允乐,這樣的話就直接到下一步了矮嫉,清理過(guò)程不是stw的

  • 也可以串行的在主GC線程執(zhí)行;這樣的話則清理過(guò)程也是stw的牍疏,

Start the world:

  • 設(shè)置gcwaiting=0

  • 喚醒P個(gè)M來(lái)繼續(xù)做G任務(wù)(此時(shí)沒有helpgc標(biāo)記)蠢笋,業(yè)務(wù)邏輯代碼開始


綜上:

是基于1.4 版本的,GC過(guò)程在標(biāo)記過(guò)程是(STW)的

在1.5 版本里面對(duì)GC做了很大的優(yōu)化鳞陨;采用三色標(biāo)記昨寞,將標(biāo)記過(guò)程細(xì)化成三段,只有前后的兩段是stw的厦滤;極大地縮短了gc的stw時(shí)間

感謝作者:liangzhiyang
查看原文:golang的垃圾回收(GC)機(jī)制

添加小編微信:grey0805援岩,加入知識(shí)學(xué)習(xí)小分隊(duì)~!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掏导,一起剝皮案震驚了整個(gè)濱河市享怀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趟咆,老刑警劉巖添瓷,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異值纱,居然都是意外死亡鳞贷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門虐唠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)悄晃,“玉大人,你說(shuō)我怎么就攤上這事÷栝希” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵翁脆,是天一觀的道長(zhǎng)眷蚓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)反番,這世上最難降的妖魔是什么沙热? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮罢缸,結(jié)果婚禮上篙贸,老公的妹妹穿的比我還像新娘。我一直安慰自己枫疆,他們只是感情好爵川,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著息楔,像睡著了一般寝贡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上值依,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天圃泡,我揣著相機(jī)與錄音,去河邊找鬼愿险。 笑死颇蜡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辆亏。 我是一名探鬼主播风秤,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼褒链!你這毒婦竟也來(lái)了唁情?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤甫匹,失蹤者是張志新(化名)和其女友劉穎甸鸟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兵迅,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抢韭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恍箭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刻恭。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鳍贾,到底是詐尸還是另有隱情鞍匾,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布骑科,位于F島的核電站橡淑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏咆爽。R本人自食惡果不足惜梁棠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斗埂。 院中可真熱鬧符糊,春花似錦、人聲如沸呛凶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)把兔。三九已至沪伙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間县好,已是汗流浹背围橡。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缕贡,地道東北人翁授。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晾咪,于是被迫代替她去往敵國(guó)和親收擦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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