閾值:默認(rèn)內(nèi)存擴(kuò)大一倍,啟動gc
成都創(chuàng)新互聯(lián)是一家以成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、成都網(wǎng)站營銷、小程序App開發(fā)等移動開發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為成都木制涼亭等眾行業(yè)中小客戶提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開發(fā)服務(wù)。
定期:默認(rèn)
手動:runtime.gc()
第一步,找出不可達(dá)的對象,做上標(biāo)記。
第二部,回收沒有被標(biāo)記的對象。
缺點(diǎn):在標(biāo)記的時(shí)候會進(jìn)行STW(Stop the world)
Stop the world
設(shè)置gcwaiting=1,這個(gè)在每一個(gè)G任務(wù)之前會檢查一次這個(gè)狀態(tài),如是,則會將當(dāng)前M 休眠;
如果這個(gè)M里面正在運(yùn)行一個(gè)長時(shí)間的G任務(wù),咋辦呢,難道會等待這個(gè)G任務(wù)自己切換嗎?這樣的話可要等10ms啊,不能等!堅(jiān)決不能等! 所以會主動發(fā)出搶占標(biāo)記(類似于上一篇),讓當(dāng)前G任務(wù)中斷,再運(yùn)行下一個(gè)G任務(wù)的時(shí)候,就會走到第1步
一直等待所有的M進(jìn)入休眠,此時(shí)所有的業(yè)務(wù)邏輯代碼都停止
啟動STW
新創(chuàng)建的對象默認(rèn)顏色是白色
GC回收從根節(jié)點(diǎn)一次遍歷所有對象,把遍歷到的對象從白色集合放入灰色集合。
循環(huán)遍歷灰色集合,將灰色對象引用的對象從白色集合放入灰色集合,之后將此灰色對象放入黑色集合,直到灰色中無任何對象
停止STW
回收所有的白色標(biāo)記表的對象.也就是回收沒有被引用的對象(垃圾)。
優(yōu)化的點(diǎn):Golang三色標(biāo)記法中最后只剩下的黑白兩種對象,黑色對象是程序恢復(fù)后接著使用的對象,如果不碰觸黑色對象,只清除白色的對象,肯定不會影響程序邏輯。所以: 清除操作和用戶邏輯可以并發(fā)。
該屏障之前的寫操作和之后的寫操作相比,先被系統(tǒng)其它組件感知。 通俗的講:就是在gc跑的過程中,可以監(jiān)控對象的內(nèi)存修改,并對對象進(jìn)行重新標(biāo)記。(實(shí)際上也是超短暫的stw,然后對對象進(jìn)行標(biāo)記)
總結(jié):創(chuàng)建對象還是對象的引用改變,都會先變?yōu)榛疑?/span>
掃描棧中內(nèi)存對象全部標(biāo)記黑色,對新增加的對象標(biāo)記為黑色
掃描堆中的全部對象,把遍歷到的對象從白色集合放入灰色集合。
循環(huán)遍歷灰色集合,將灰色對象引用的對象從白色集合放入灰色集合,之后將此灰色對象放入黑色集合,直到灰色中無任何對象,對重新引用的對象標(biāo)記為灰色,對被添加的對象標(biāo)記為灰色。
回收所有的白色標(biāo)記表的對象.也就是回收垃圾。
優(yōu)化的點(diǎn):標(biāo)記操作和用戶邏輯也是并發(fā)的,用戶邏輯會時(shí)常生成對象或者改變對象的引用,那么標(biāo)記和用戶邏輯如何并發(fā)呢?因?yàn)橛脩暨壿嬙跁嬖趧?chuàng)建新的對象和改變對象引用的情況,所以寫屏障機(jī)制