1、標(biāo)記 - 清除
將存活的對(duì)象進(jìn)行標(biāo)記,然后清理掉未被標(biāo)記的對(duì)象。不足:
標(biāo)記和清除過(guò)程效率都不高;會(huì)產(chǎn)生大量不連續(xù)的內(nèi)存碎片,導(dǎo)致無(wú)法給大對(duì)象分配內(nèi)存。
2、標(biāo)記 - 整理
讓所有存活的對(duì)象都向一端移動(dòng),然后直接清理掉端邊界以外的內(nèi)存。
3、復(fù)制
將內(nèi)存劃分為大小相等的兩塊,每次只使用其中一塊,當(dāng)這一塊內(nèi)存用完了就將還存活的對(duì)象復(fù)制到另一塊上面,然后再把使用過(guò)的內(nèi)存空間進(jìn)行一次清理。
主要不足是只使用了內(nèi)存的一半。
現(xiàn)在的商業(yè)虛擬機(jī)都采用這種收集算法來(lái)回收新生代,但是并不是將新生代劃分為大小相等的兩塊,而是分為一塊較大的 Eden 空間和兩塊較小的 Survivor 空間,每次使用 Eden 空間和其中一塊 Survivor。在回收時(shí),將 Eden 和 Survivor 中還存活著的對(duì)象一次性復(fù)制到另一塊 Survivor 空間上,最后清理 Eden 和使用過(guò)的那一塊 Survivor。
HotSpot 虛擬機(jī)的 Eden 和 Survivor 的大小比例默認(rèn)為 8:1,保證了內(nèi)存的利用率達(dá)到 90%。如果每次回收有多于 10% 的對(duì)象存活,那么一塊 Survivor 空間就不夠用了,此時(shí)需要依賴于老年代進(jìn)行分配擔(dān)保,也就是借用老年代的空間存儲(chǔ)放不下的對(duì)象。
4、分代收集
現(xiàn)在的商業(yè)虛擬機(jī)采用分代收集算法,它根據(jù)對(duì)象存活周期將內(nèi)存劃分為幾塊,不同塊采用適當(dāng)?shù)氖占惴ā?/p>
一般將堆分為新生代和老年代。
新生代使用:復(fù)制算法老年代使用:標(biāo)記 - 清除 或者 標(biāo)記 - 整理 算法