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