垃圾收集算法

标记-清除算法

如同它的名字一样,分为标记清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

缺点
1. 标记和清除两个过程效率不高
2. 标记清除后会产生大量不连续的空间,空间碎片太多导致以后程序分配较大对象时,无法找到足够大的连续空间而不得不提前触发另一次垃圾收集动作

复制算法

将内存容量划分为大小相等的两块,每次只使用其中的一块

优点
1. 实现简单,运行高效
缺点
1. 内存缩小为原来的一半,代价太高
  • 研究表明新生代的对小98%都是朝生夕死的,并不需要1:1的比例来划分内存空间,而是将内存划分为一块较大的Eden空间和2两块较小的Survivor空间,每次只使用Eden和其中的一块Survivor。当回收时,将Eden和Survivor中还存活的对象一次性复制到另一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot虚拟机默认Eden和Survivor大小比例是8:1,每次只有10%的空间被浪费。当Survivor空间不够时,需要依赖老年代进行分配担保。

标记-整理算法

标记所需回收的对象,然后将所有存活的对象都像一端移动,然后直接清理掉端边界意外的内存

优点
1. 不会像复制算法那样浪费空间
2. 不会产生空间碎片

分代收集算法

一般把java虚拟机堆分为新生代和老年代,这样可以根据各个年代的特点采用最适当的收集算法,当前商业虚拟机的垃圾收集都采用分代收集算法。新生代一般都有大量对象死去,一般采用复制算法,老年代因为存活率高、没有额外空间对他进行分配担保,就必须采用标记-清理或者标记-整理算法

参考: 深入理解java虚拟机