go內(nèi)存管理-垃圾回收-學(xué)習(xí)心得
今天學(xué)習(xí)了下go內(nèi)存管理中的垃圾回收,分享下心得
首先、分享下常見(jiàn)幾種垃圾回收的機(jī)制
1、引用技術(shù)法:記錄對(duì)象被引用的次數(shù),創(chuàng)建時(shí)為1,每次被引用加1。每次引用被回收就減1。當(dāng)計(jì)數(shù)為0時(shí),回收該對(duì)象。
使用該機(jī)制的語(yǔ)言有python
優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,對(duì)象可以很快的被回收
缺點(diǎn):不能很好的處理循環(huán)引用
2、標(biāo)記清除法:從根對(duì)象出發(fā),掃描每個(gè)對(duì)象,根據(jù)其是否被引用做相應(yīng)的標(biāo)記。等掃描結(jié)束后,回收沒(méi)有被標(biāo)記的對(duì)象。
go語(yǔ)言就是使用的三色標(biāo)記法
優(yōu)點(diǎn):解決了引用計(jì)數(shù)的缺點(diǎn)。
缺點(diǎn):需要STW,即要暫時(shí)停掉程序運(yùn)行。
3、分代回收:將對(duì)象分為不同分代,如老生代和新生代等,不同分代采取不同的回收算法。
優(yōu)點(diǎn):回收性能好
缺點(diǎn):算法復(fù)雜
重點(diǎn)說(shuō)明下go的三色標(biāo)記法
其實(shí)沒(méi)有所謂的三色標(biāo)記,是三種狀態(tài)。
灰色:對(duì)象等待處理
黑色:對(duì)象已被標(biāo)記
白色:對(duì)象未被標(biāo)記
回收時(shí),首先將所有對(duì)象標(biāo)記為白色。然后從根對(duì)象出發(fā),將其標(biāo)記為黑色,將其引用對(duì)象標(biāo)記為灰色。直到掃描結(jié)束。然后取出所有灰色對(duì)象,將其標(biāo)記為黑色,將其引用對(duì)象標(biāo)記為灰色。循環(huán)這個(gè)過(guò)程。直到?jīng)]有灰色對(duì)象。此時(shí),所有存活對(duì)象都已經(jīng)被標(biāo)記了,回收所有白色對(duì)象。
垃圾回收觸發(fā)時(shí)機(jī)
1、內(nèi)存分配時(shí)檢測(cè)到分配的內(nèi)存時(shí)之前的一倍及以上時(shí)觸發(fā)
2、默認(rèn)2分鐘觸發(fā)一次。
3、可以手動(dòng)觸發(fā) runtime.GC()
參考自go專(zhuān)家編程
第四章:內(nèi)存管理 - 4.2 垃圾回收原理 - 《GO專(zhuān)家編程》 - 書(shū)棧網(wǎng) · BookStack