Skip to content

垃圾回收算法介绍

垃圾回收算法

垃圾回收(GC)算法用于识别和清理堆中不再使用的对象,JVM 主要采用以下算法: 1. 标记-清除(Mark-Sweep):标记垃圾后直接清除。 2. 标记-复制(Mark-Copy):标记存活对象,复制到新区域。 3. 标记-整理(Mark-Compact):标记后整理存活对象,消除碎片。 4. 分代收集(Generational Collection):按对象生命周期分代回收。

核心点

  • 识别垃圾(标记) + 回收空间。

1. 算法详解

(1) 标记-清除(Mark-Sweep)

  • 原理
  • 标记:从根集(GC Roots,如栈引用、静态变量)遍历,标记存活对象。
  • 清除:扫描堆,回收未标记对象。
  • 优点
  • 简单,易实现。
  • 不移动对象,适合存活对象多的情况。
  • 缺点
  • 内存碎片:回收后空间不连续。
  • 效率低:标记和清除都需全堆扫描。
  • 示例
堆: [Obj1, Obj2, Obj3]
标记: [Live, Dead, Live]
清除: [Obj1, null, Obj3]
  • 适用
  • 老年代,存活对象较多。

(2) 标记-复制(Mark-Copy)

  • 原理
  • 将堆分为两块区域(From 和 To)。
  • 标记:标记存活对象。
  • 复制:将存活对象复制到 To 区,清空 From 区。
  • 交换 From 和 To。
  • 优点
  • 无碎片,空间连续。
  • 效率高,只处理存活对象。
  • 缺点
  • 空间浪费:一半内存闲置。
  • 存活对象多时复制开销大。
  • 示例
From: [Obj1, Obj2, Obj3]
标记: [Live, Dead, Live]
To:   [Obj1, Obj3]
  • 适用
  • 年轻代,对象存活率低。

(3) 标记-整理(Mark-Compact)

  • 原理
  • 标记:标记存活对象。
  • 整理:将存活对象移动到堆一端,清除剩余空间。
  • 优点
  • 无碎片,空间利用率高。
  • 适合存活对象多的情况。
  • 缺点
  • 移动对象开销大,效率低于复制。
  • 需多次扫描堆。
  • 示例
堆: [Obj1, Obj2, Obj3]
标记: [Live, Dead, Live]
整理: [Obj1, Obj3]
  • 适用
  • 老年代,减少碎片。

(4) 分代收集(Generational Collection)

  • 原理
  • 根据对象生命周期分为:
    • 年轻代:短生命周期,频繁回收。
    • 老年代:长生命周期,回收较少。
  • 年轻代用标记-复制,老年代用标记-清除或整理。
  • 假设
  • 弱分代假说:大部分对象朝生夕死。
  • 强分代假说:存活越久越难回收。
  • 过程
  • 新对象在 Eden 创建。
  • Minor GC:Eden → Survivor,存活对象晋升。
  • Major GC:老年代回收。
  • 优点
  • 结合多种算法优点,提高效率。
  • 缺点
  • 实现复杂,需调参。
  • 适用
  • JVM 默认策略(如 G1、CMS)。

2. GC Roots

  • 定义
  • 垃圾回收的起点。
  • 来源
  • 栈中局部变量。
  • 方法区静态变量。
  • 本地方法栈 JNI 引用。
  • 作用
  • 可达性分析,标记存活对象。

3. JVM 中的实现

  • Serial
  • 单线程,标记-复制(年轻代)+ 标记-整理(老年代)。
  • Parallel
  • 多线程并行,类似 Serial。
  • CMS(Concurrent Mark Sweep)
  • 并发标记-清除,老年代为主。
  • 优点:低停顿。
  • 缺点:碎片、浮动垃圾。
  • G1(Garbage First)
  • 分代 + 区域化(Region)。
  • 标记-复制 + 整理,预测停顿时间。

图示

堆:
年轻代: [Eden | S0 | S1] --> 标记-复制
老年代: [Region1 | Region2] --> 标记-整理

4. 优缺点对比

算法 优点 缺点 适用场景
标记-清除 简单,不移动对象 碎片,效率低 老年代
标记-复制 无碎片,效率高 空间浪费,复制成本 年轻代
标记-整理 无碎片,空间利用高 移动开销大 老年代
分代收集 综合优化,效率高 实现复杂 通用(JVM 默认)

5. 延伸与面试角度

  • 与 GC 收集器
  • CMS 用标记-清除。
  • G1 混合复制和整理。
  • 调优
  • -Xmn:调整年轻代大小。
  • -XX:+UseG1GC:启用 G1。
  • 实际应用
  • Web 服务:低停顿优先(CMS、G1)。
  • 批处理:吞吐量优先(Parallel)。
  • 面试点
  • 问“算法”时,提四种及优缺点。
  • 问“分代”时,提假说和过程。

总结

垃圾回收算法包括标记-清除、标记-复制、标记-整理和分代收集,各有优劣,JVM 结合分代思想优化性能。面试时,可提算法原理或画堆结构,展示理解深度。