相关系列
分代垃圾收集理论
当前虚拟机大部分的垃圾收集器都采用了分代收集算法,这个构思并不是个新事物,只是根据对象存活周期的不同将内存划分为几块。常见的将java堆分新生代和老年代这样我们就可以依据各个年龄代的特点选择合适的垃圾收集算法。
标记复制算法
为了解决效率问题,“标记-复制”算法被人们提出来。它将内存分为大小相同的两块,每次操作只使用其中的一块,当这一块内存用完了,把还存活的对象复制到另外一块去,然后再把使用的空间一次性清理掉,这样每次内存回收都是对内存空间的一半进行回收。
标记整理算法
算法分为“标记”和“整理”二个阶段,第一个阶段标记存活的对象,统一回收所有未被标记的对象(一般选择这种)也可以反过来,标记出所需要回收的对象;第二个阶段是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。
标记清除算法
算法分为“标记”和“清除”二个阶段,第一个阶段标记存活的对象,统一回收所有未被标记的对象(一般选择这种)也可以反过来,标记出所需要回收的对象;第二阶段统一回收所有被标记的对象。这是最基础的收集算法,相对来说不复杂,但是会带来了二个性能问题:
1、效率问题(如果标记过多,效率不高)
2、空间问题(标记清除后产生大量不连续的空间碎片)
总结
在新生代中,普遍每次收集大概有99%的对象都会让清理掉,所以只要付出少量的对象复制成本就可以完成每次垃圾收集。老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们选择“标记-整理”或者“标记-清除”算法进行垃圾收集。很重要的一点,“标记-清理”和“标记-整理”垃圾算法会比“标记-复制”垃圾算法慢10倍以上。