一、標(biāo)記——清除算法
- 實現(xiàn):
- 算法分為“標(biāo)記”和“清除”兩個階段:首先標(biāo)記出所有需要回收的對象们拙,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對象沼死。
- 特點:
- 是最基礎(chǔ)的收集算法
- 缺點:
- 效率問題,標(biāo)記和清除兩個過程的效率都不高
- 空間問題呕童,標(biāo)記清除之后會產(chǎn)生大量不連續(xù)的內(nèi)存碎片漆际,空間碎片太多可能會導(dǎo)致以后在程序運行過程中需要分配較大對象時,無法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次收集動作夺饲。
二奸汇、復(fù)制算法
- 實現(xiàn):
- 將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊往声。當(dāng)這一塊的內(nèi)存用完了擂找,就將還存活著的對象復(fù)制到另一塊上面,然后再把已使用過的內(nèi)存空間一次清理調(diào)浩销。這樣使用每次都是對整個半?yún)^(qū)進行內(nèi)存回收贯涎。
- 特點:
- 實現(xiàn)簡單,運行高效
- 現(xiàn)在的商業(yè)虛擬機都采用這種收集算法來回收新生代
- 缺點:
- 將內(nèi)存縮小為了原來的一半慢洋,代價太高
- 對象存活率較高時就要進行較多的復(fù)制操作塘雳,效率將會變低。更關(guān)鍵的是且警,如果不想浪費 50% 的空間粉捻,就需要有額外的空間進行分配擔(dān)保,以應(yīng)對被使用的內(nèi)存中所有對象都 100% 存活的極端情況斑芜,所以在老年代一般不能直接選用這種算法肩刃。
三、標(biāo)記-整理算法
- 實現(xiàn):
- 標(biāo)記過程仍然與“標(biāo)記——清除”算法一樣杏头,但后續(xù)步驟不是直接對可回收對象進行清理盈包,而是讓所有存活的對象都向一端移動,然后直接清理掉端邊界以外的內(nèi)存醇王。
四呢燥、分代收集算法
當(dāng)前商業(yè)虛擬機的垃圾收集都采用“分代收集”(Generational Collection)算法。
- 實現(xiàn):
- 一般是把 Java 堆分為新生代和老年代寓娩,這樣就可以根據(jù)各個年代的特點采用最適當(dāng)?shù)氖占惴ā?/li>
- 在新生代中叛氨,每次垃圾收集時都發(fā)現(xiàn)有大批對象死去呼渣,只有少量存活,那就選用復(fù)制算法寞埠,只需要付出少量存活對象的復(fù)制成本就可以完成收集屁置。
- 老年代因為對象存活率高、沒有額外空間對它進行分配擔(dān)保仁连,就必須使用“標(biāo)記——清除”或者“標(biāo)記整理”算法來進行回收蓝角。