復(fù)制垃圾回收算法

復(fù)制垃圾回收算法(Copying GC),是1963年由Marvin L. Minsky 研究得出的垃圾回收算法,簡(jiǎn)單的說(shuō)它是通過(guò)將內(nèi)存分為兩個(gè)空間,在垃圾回收是將空間1的活動(dòng)對(duì)象,直接復(fù)制到空間2中,然后全部回收掉空間1的對(duì)象。這里的空間1和空間2,分別被稱為來(lái)源空間目標(biāo)空間。

碰撞分配

碰撞分配算法是在復(fù)制GC中,通過(guò)碰撞或者遞增指針來(lái)跟蹤下次分配發(fā)生的地方,以便從大塊連續(xù)的內(nèi)存堆中分配相鄰的內(nèi)存段。下圖就是復(fù)制GC持有的分配指針,在每次內(nèi)存分配的時(shí)候,它從內(nèi)存堆中返回一段內(nèi)存地址,然后再將分配指針向后移動(dòng),這樣地址空間時(shí)連續(xù)的,但是因?yàn)榉峙涞膶?duì)象大小的不同,所以分配的比例并不是平均的。

這種方式的優(yōu)點(diǎn)是,簡(jiǎn)單易行,運(yùn)行速度快,并且因?yàn)槊看畏峙涞膬?nèi)存段都是相鄰的,所以具有很好的局部引用性,意思就是應(yīng)用程序如果重復(fù)訪問(wèn)同一片內(nèi)存段,那么CPU可以將那片內(nèi)存段緩存起來(lái),用以提供程序訪問(wèn)的速度。

半空間算法

碰撞分配講到了復(fù)制GC如何分配,半空間算法才是真正的垃圾回收,半空間算法是在,初始內(nèi)存堆消耗殆盡時(shí),通過(guò)GC標(biāo)識(shí)存活對(duì)象和垃圾對(duì)象(這個(gè)階段和標(biāo)記清除算法是一樣的)也就是標(biāo)記階段,在回收階段,GC將通過(guò)碰撞分配的來(lái)源空間(From-Space)中的存活的對(duì)象,全部移動(dòng)到目標(biāo)空間(To-Space)中。

上圖中"M"的區(qū)域就是存活的對(duì)象,空白區(qū)域是垃圾對(duì)象底部空間就是目標(biāo)空間(To-Space)在回收階段復(fù)制GC將存活對(duì)象連續(xù)的復(fù)制到目標(biāo)空間(進(jìn)行保持局部引用性)分配指針向后移動(dòng)。

我們從上圖看到存活對(duì)象已經(jīng)被全部復(fù)制到目標(biāo)空間,但是我們的內(nèi)存分配只能在來(lái)源空間進(jìn)行,并且現(xiàn)在來(lái)源空間的內(nèi)存還沒(méi)有被回收掉,那么復(fù)制GC的最后一個(gè)階段就是空間交換,然后在交換完成是清空目標(biāo)空間。

半空間算法的簡(jiǎn)單快速的優(yōu)點(diǎn),同時(shí)帶來(lái)了另外一個(gè)問(wèn)題,就是內(nèi)存使用的低效,我們需要維護(hù)兩個(gè)空間相同的內(nèi)存堆來(lái),并且僅僅有一個(gè)內(nèi)存對(duì)是當(dāng)前能夠正在被使用的,意味著要分配實(shí)際使用內(nèi)存的兩倍。

總結(jié)

我們來(lái)回顧一下復(fù)制垃圾回收算法的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 高吞度量:因?yàn)閮H僅需要在標(biāo)記階段消耗實(shí)際,復(fù)制階段無(wú)需太多時(shí)間,所以GC的時(shí)間消耗和空間中的活動(dòng)對(duì)象數(shù)量成正比,相比于標(biāo)記清除GC有較高的吞吐量。
  • 高速分配:與標(biāo)記清除算法使用空閑列表進(jìn)行內(nèi)存分配不同,復(fù)制GC使用連續(xù)的內(nèi)存空間,這樣就省去的使用空閑列表,分配內(nèi)存時(shí),線性查找可分配空間的時(shí)間消耗。
  • 局部引用緩存和空間壓縮:因?yàn)閺?fù)制GC的分配是連續(xù)的,所以在可以利用局部引用緩存,并且每次GC后內(nèi)存空間都會(huì)被集中到空間的一段,也就實(shí)現(xiàn)了空間壓縮。

缺點(diǎn)

  • 空間效率低 復(fù)制GC需使用兩個(gè)堆空間,也就是實(shí)際空間的兩倍,這樣的內(nèi)存消耗耗是比較客觀的。
  • 遞歸復(fù)制 因要整體的復(fù)制存活對(duì)象到目標(biāo)空間去,所以復(fù)制GC使用了遞歸方式,復(fù)制存活對(duì)象的子對(duì)象。如果遞歸層次太深還可能產(chǎn)生溢出。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容