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

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

Golang的GC回收機(jī)制

Golang的GC回收機(jī)制

GC觸發(fā)的條件

  • 閾值:默認(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)2min觸發(fā)一次gc,src/runtime/proc.go:forcegcperiod

  • 手動:runtime.gc()

v1.3版本 標(biāo)記清除法

第一步,找出不可達(dá)的對象,做上標(biāo)記。

第二部,回收沒有被標(biāo)記的對象。

缺點(diǎn):在標(biāo)記的時(shí)候會進(jìn)行STW(Stop the world)

Stop the world

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

  2. 如果這個(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步

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

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

  1. 啟動STW

  2. 新創(chuàng)建的對象默認(rèn)顏色是白色

  3. GC回收從根節(jié)點(diǎn)一次遍歷所有對象,把遍歷到的對象從白色集合放入灰色集合。

  4. 循環(huán)遍歷灰色集合,將灰色對象引用的對象從白色集合放入灰色集合,之后將此灰色對象放入黑色集合,直到灰色中無任何對象

  5. 停止STW

  6. 回收所有的白色標(biāo)記表的對象.也就是回收沒有被引用的對象(垃圾)。

優(yōu)化的點(diǎn):Golang三色標(biāo)記法中最后只剩下的黑白兩種對象,黑色對象是程序恢復(fù)后接著使用的對象,如果不碰觸黑色對象,只清除白色的對象,肯定不會影響程序邏輯。所以: 清除操作和用戶邏輯可以并發(fā)。

v1.8版本 混合寫屏障機(jī)制(hybrid write barrier)

寫屏障

該屏障之前的寫操作和之后的寫操作相比,先被系統(tǒng)其它組件感知。 通俗的講:就是在gc跑的過程中,可以監(jiān)控對象的內(nèi)存修改,并對對象進(jìn)行重新標(biāo)記。(實(shí)際上也是超短暫的stw,然后對對象進(jìn)行標(biāo)記)

總結(jié):創(chuàng)建對象還是對象的引用改變,都會先變?yōu)榛疑?/span>

步驟

  1. 掃描棧中內(nèi)存對象全部標(biāo)記黑色,對新增加的對象標(biāo)記為黑色

  2. 掃描堆中的全部對象,把遍歷到的對象從白色集合放入灰色集合。

  3. 循環(huán)遍歷灰色集合,將灰色對象引用的對象從白色集合放入灰色集合,之后將此灰色對象放入黑色集合,直到灰色中無任何對象,對重新引用的對象標(biāo)記為灰色,對被添加的對象標(biāo)記為灰色。

  4. 回收所有的白色標(biāo)記表的對象.也就是回收垃圾。

優(yōu)化的點(diǎn):標(biāo)記操作和用戶邏輯也是并發(fā)的,用戶邏輯會時(shí)常生成對象或者改變對象的引用,那么標(biāo)記和用戶邏輯如何并發(fā)呢?因?yàn)橛脩暨壿嬙跁嬖趧?chuàng)建新的對象和改變對象引用的情況,所以寫屏障機(jī)制會把新的對象都會先變?yōu)榛疑?/span>


網(wǎng)站題目:Golang的GC回收機(jī)制
分享鏈接:http://weahome.cn/article/dsoisij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部