跳转至

垃圾收集算法

1. 标记-清除算法(Mark-Sweep)

  • 分为两个阶段:标记和清除。
  • 不足:

    • 效率问题
    • 空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

2. 复制算法(Coping)

为了解决效率问题,复制算法将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

代价是将内存缩小为了原来的一半。

3. 标记-整理算法(Mark-Compact)

标记,然后将所有存活的对象都向一段移动,然后直接清理掉边界以外的内存。

4. 分代收集算法(Generational Collection)

根据对象存活周期的不同将内存划分为几块。

一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

新生代,少量存活——复制算法

老年代,大量存活——“标记-清理”或者“标记-整理”