1、标记-清除
将存活的对象进行标记,然后清理掉未被标记的对象。
不足:
标记和清除过程效率不高
会产生大量不连续的内存碎片,导致无法给大对象分配内存
2、标记-整理
让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。
3、复制
将内存划分成大小相等的两块,每次只使用其中一块,当这一块内存用完了就将还存活的对象复制到另一块上面。然后再把使用过的内存空间进行一次清理。
主要不足是只使用了内存的一半。
现在的商业操作虚拟机都采用这种收集算法回收新生代,但是并不是将新生代划分成大小相等的两块,而是分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden空间和其中一块Survivor,在回收时,将Eden和Survivor中还存回的对象一次性复制到另一块Survivor空间上,最后清理Eden和使用过的那一块Survivor.
HotSpot虚拟机的Eden和Survivor的大小比例默认为8:1 保证了内存的利用率高达90%。如果每次回收有多于10%的对象存活,那一块Survivor空间就不够用了,此时需要依赖于老年代进行分配担保,也就是借用老年代的空间存放放不下的对象。
4、分代回收
现在的商业商业虚拟机采用分代收集算法,他根据对象的存活周期将内存划分为几块,不同块采用适当的收集算法,
一般将堆分为新生代和老年代
新生代使用:复制算法
老年代使用:标记-清除算法 标记-整理算法