在jvm的堆内存中有年轻代和老年代, 年轻代中由于存活对象较少,所以采用复制收集算法。 老年代中由于对象存活率高,且没有额外的内存,所以就采用标记整理或者标记清楚的算法。 简单的介绍下不同垃圾收集算法的优缺点,以及选择该收集算法的原因。
标记清除算法
它是垃圾收集算法中最基础的算法,后续算法都是针对该算法的不足进行改进。 标记清除算法分为标记和清除两个过程,所以效率就比较低下。 空间上也会因为在清除上产生大量的不连续内存,在程序运行中需要较大内存的时候, 会因为无法找到较大内存,而触发下一次gc。
复制收集算法
分配一半的内存用于保存存活的对象,每次回收用过的半区内存。 现在的商业虚拟机用的就是该算法,产生了Eden(8):Survior(1):Survior(1)这样的内存比例。
标记整理算法
前面复制收集算法的缺点是浪费了一半的内存,以及如果存活对象较多的话,会导致复制效率低。 标记与之前一样,整理即将所有存活的对象移动到同一端,直接清理掉另外一端的内存。