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