垃圾收集算法
分代收集理论
- 新生代收集( Minor GC/Young GC) : 指目标只是新生代的垃圾收集。
- 老年代收集( Major GC/Old GC) : 指目标只是老年代的垃圾收集。 目前只有CMS收集器会有单独收集老年代的行为。 另外请注意“Major GC”这个说法现在有点混淆, 在不同资料上常有不同所指,读者需按上下文区分到底是指老年代的收集还是整堆收集。
- 混合收集( Mixed GC) : 指目标是收集整个新生代以及部分老年代的垃圾收集。 目前只有G1收集器会有这种行为
- 整堆收集( Full GC) : 收集整个Java堆和方法区的垃圾收集。
标记-清除算法
最基础的算法 :算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象, 在标记完成后, 统一回收掉所有被标记的对象, 也可以反过来, 标记存活的对象, 统一回收所有未被标记的对象。 标记过程就是对象是否属于垃圾的判定过程
缺点:
- 执行效率不稳定
如果Java堆中包含大量对象, 而且其中大部分是需要被回收的, 这时必须进行大量标记和清除的动作, 导致标记和清除两个过程的执行效率都随对象数量增长而降低 - 内存空间碎片化问题
标记、 清除之后会产生大量不连续的内存碎片, 空间碎片太多可能会导致当以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作
标记-复制算法
简称复制算法,为了解决标记-清除算法面对大量可回收对象时执行效率低的问题而提出
:它将可用内存按容量划分为大小相等的两块, 每次只使用其中的一块。 当这一块的内存用完了, 就将还存活着的对象复制到另外一块上面, 然后再把已使用过的内存空间一次清理掉针对分区:新生代的幸存0区1区,也称之为form区to区,谁空谁为to
缺点:
- 浪费空间
将可用内存缩小为了原来的一半