真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Golang的垃圾回收(GC)機制

轉(zhuǎn)載自https://blog.csdn.net/liangzhiyang/article/details/52670021

成都創(chuàng)新互聯(lián)公司科技有限公司專業(yè)互聯(lián)網(wǎng)基礎(chǔ)服務(wù)商,為您提供電信內(nèi)江機房,高防主機,成都IDC機房托管,成都主機托管等互聯(lián)網(wǎng)服務(wù)。

請先閱讀 golang的goroutine調(diào)度機制然后再到這里


golang的垃圾回收采用的是 標(biāo)記-清理(Mark-and-Sweep) 算法

就是先標(biāo)記出需要回收的內(nèi)存對象快,然后在清理掉;

在這里不介紹標(biāo)記和清理的具體策略(可以參考https://lengzzz.com/note/gc-in-golang),只介紹 GC過程是怎么調(diào)度的以及stw相關(guān)

這個算法,會導(dǎo)致 stw (stop the world)的問題,中斷用戶邏輯

觸發(fā)GC機制

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

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

 

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

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

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

3.    清理:有一個單獨的goroutine去清理已經(jīng)標(biāo)記的內(nèi)存對象快

4.    start the world,設(shè)置gcwaiting=0,喚醒所有的M(不會超過P個數(shù))

 

對于上面的三個步驟,分別解釋:

stop the world:

1.    設(shè)置gcwaiting=1,這個在每一個G任務(wù)之前會檢查一次這個狀態(tài),如是,則會將當(dāng)前M休眠;

2.    如果這個M里面正在運行一個長時間的G任務(wù),咋辦呢,難道會等待這個G任務(wù)自己切換嗎?這樣的話可要等10ms啊,不能等!堅決不能等!
所以會主動發(fā)出搶占標(biāo)記(類似于上一篇),讓當(dāng)前G任務(wù)中斷,再運行下一個G任務(wù)的時候,就會走到第1步

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

標(biāo)記:

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

2.    對于一個M,喚醒前設(shè)置它的helpgc標(biāo)記,喚醒之后這個M會立馬判斷這個標(biāo)記,如是,則開始做分配給自己的標(biāo)記任務(wù),如果先做完了,就會從別的M里面找一些來做

3.    等每一個M都做完,會再次進(jìn)入休眠

清理:

1.    通過設(shè)置參數(shù),可以以一個單獨goroutine  運行,這個功能是在1.3版本之后增加的,這樣的話就直接到下一步了,清理過程不是stw的

2.    也可以串行的在主GC線程執(zhí)行;這樣的話則清理過程也是stw的,

start the world:

1.    設(shè)置gcwaiting=0

2.    喚醒P個M來繼續(xù)做G任務(wù)(此時沒有helpgc標(biāo)記),業(yè)務(wù)邏輯代碼開始

 

 

綜上:

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

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

Golang的垃圾回收(GC)機制


分享題目:Golang的垃圾回收(GC)機制
標(biāo)題來源:http://weahome.cn/article/jsidop.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部