Java 垃圾收集算法

分代收集理论

当前虚拟机的垃圾收集都采用分代收集理论,根据对象存活时间不同将内存分为几块。Java推分为新生代和老年代,我们根据各个年龄代不同的特性选择合适的垃圾收集算法。在新生代,每次收集都会有大量的对象(99%)死亡,可以选择复制算法,只需要付出少量对象的复制成本就可以完成垃圾收集。老年代存活率比较高,而且没有额外的空间对它进行分配担保,所以我们必须选择标记-清除或者标记-整理算法。标记清除和标记整理算会会比复制算法慢10倍以上。

垃圾收集算法

复制算法

复制算法将内存分为大小相同的两块,每次只使用其中一块。当其中一块使用完时,就将存活的对象复制到另一块上,然后把这块空间清理干净。每次回收都是对内存空间的一半进行回收。

优点
  • 收集后无内存碎片
缺点
  • 浪费一半内存空间

标记-清除算法

标记-清除算法分为标记、清除两个阶段,先标记存活的对象,再统一回收未被标记的对象(通常情况),也可以标记需要回收的对象,标记完后统一回收标记过的对象。

优点
  • 算法简单,相对标记整理快
缺点
  • 如果需要标记的对象太多,效率不高
  • 清除后产生大量不连续内存碎片

标记-整理算法

标记-整理算法在标记这个阶段,与标记-清除算法一致,但后续并不是直接回收垃圾对象,而是将存活对象对象挪到一端,剩下的空间清理掉。

优点
  • 无碎片产生
缺点
  • 因为要移动对象,相对标记-清除算法会慢