標(biāo)記-清除算法(Mark-Sweep)
1、標(biāo)記出所有需要回收的對(duì)象,在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對(duì)象
2、在標(biāo)記完成后統(tǒng)一回收所有被標(biāo)記的對(duì)象
缺點(diǎn):一個(gè)是效率問(wèn)題冗栗,標(biāo)記和清除兩個(gè)過(guò)程的效率都不高;
另一個(gè)是空間問(wèn)題供搀,標(biāo)記清除之后會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片隅居,空間碎片太多可能會(huì)導(dǎo)致以后在程序運(yùn)行過(guò)程中
需要分配較大對(duì)象時(shí),無(wú)法找到足夠的連續(xù)內(nèi)存而不得不提前觸發(fā)另一次垃圾收集動(dòng)作葛虐。
復(fù)制算法(Copying)
1胎源、將可用內(nèi)存按容量劃分為大小相等的兩塊,每次只使用其中的一塊屿脐。
2涕蚤、當(dāng)這一塊的內(nèi)存用完了宪卿,就將還存活著的對(duì)象復(fù)制到另外一塊上面,然后再把已使用過(guò)的內(nèi)存空間一次清理掉万栅。
優(yōu)點(diǎn):這樣使得每次都是對(duì)整個(gè)半?yún)^(qū)進(jìn)行內(nèi)存回收佑钾,內(nèi)存分配時(shí)也就不用考慮內(nèi)存碎片等
復(fù)雜情況,只要移動(dòng)堆頂指針烦粒,按順序分配內(nèi)存即可次绘,實(shí)現(xiàn)簡(jiǎn)單,運(yùn)行高效撒遣。只是這種算法的代價(jià)是將內(nèi)存縮小為
了原來(lái)的一半,未免太高了一點(diǎn)管跺。
缺點(diǎn):復(fù)制收集算法在對(duì)象存活率較高時(shí)就要進(jìn)行較多的復(fù)制操作义黎,效率將會(huì)變低
標(biāo)記-整理算法(Mark-Compact)
1、標(biāo)記
2豁跑、讓所有存活的對(duì)象都向一端移動(dòng)廉涕,然后直接清理掉端邊界以外的內(nèi)存
分代收集算法(Generational Collection)
1、根據(jù)對(duì)象存活周期的不同將內(nèi)存劃分為幾塊艇拍。
2狐蜕、一般是把Java堆分為新生代和老年代,這樣就可以根據(jù)各個(gè)年代的特點(diǎn)采用最適當(dāng)?shù)氖占惴ā?br>
3卸夕、在新生代中层释,每次垃圾收集時(shí)都發(fā)現(xiàn)有大批對(duì)象死去,只有少量存活快集,那就選用復(fù)制算法贡羔,只需要付出少量存活對(duì)象的復(fù)制成本就可以完成收集。
4个初、老年代中因?yàn)閷?duì)象存活率高乖寒、沒(méi)有額外空間對(duì)它進(jìn)行分配擔(dān)保,就必須使用“標(biāo)記—清理”或者“標(biāo)記—整理”算法來(lái)進(jìn)行回收院溺。