垃圾收集算法

JVM 中常见的三种垃圾收集算法:

  • 标记-清除算法(Mark_Sweep)
  • 复制算法(Copying)
  • 标记-压缩算法(Marrk_Compact)

当前商业虚拟机的垃圾收集都采用 分代收集算法,根据对象存活周期将内存划分为几块,根据各个年代的特点采用最适当的收集算法。

标记-清除算法

首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

缺点:

  • 标记的清除的效率都不高
  • 清除后产生大量不连续的内存。如果出现需要创建大对象,连续内存空间不够的情况,就需要触发另一次垃圾收集动作

复制算法

将可用内存按容量划分为大小相等的两块,每次只使用其中一块。当一块内存用完了,将还存活的对象复制到另外一块上面,然后将这块的内存空间一次清理掉。

优点:

  • 解决了内存碎片问题

缺点:

  • 内存缩小为一半,存活对象越多效率越低

标记-整理算法

先标记出要被回收的对象,然后让所有存活的对象向一端移动,然后直接清理掉边界以外的内存。