什么是 Java 的垃圾回收机制?有哪些常见的垃圾回收算法?

推荐答案

面试题:什么是 Java 的垃圾回收机制?有哪些常见的垃圾回收算法?

总结性回答

Java 的垃圾回收机制(Garbage Collection, GC)是 JVM 自动管理内存的核心机制,它负责自动回收不再使用的对象占用的内存空间。常见的垃圾回收算法包括:标记-清除算法、复制算法、标记-整理算法、分代收集算法等。现代 JVM 通常采用分代收集策略,结合多种算法来优化垃圾回收性能。

详细解释

1. Java 垃圾回收机制

Java 垃圾回收机制的主要特点:

  • 自动内存管理:开发者无需手动释放内存,由 JVM 自动完成
  • 基于可达性分析:通过 GC Roots 对象作为起点,判断哪些对象可达(存活),哪些不可达(可回收)
  • Stop-The-World:垃圾回收时会暂停所有应用线程(某些并发收集器可以部分避免)

垃圾回收的主要工作:

  1. 识别哪些对象不再被使用
  2. 回收这些对象占用的内存空间
  3. 整理内存碎片(某些算法)

2. 常见垃圾回收算法

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

  • 过程
    • 标记阶段:遍历所有可达对象并标记
    • 清除阶段:回收未被标记的对象内存
  • 优点:实现简单
  • 缺点
    • 产生内存碎片
    • 效率不高(需要两次遍历)

(2) 复制算法(Copying)

  • 过程
    • 将内存分为两块,每次只使用一块
    • 将存活对象复制到另一块内存
    • 清除原内存块
  • 优点
    • 无内存碎片
    • 效率高(只需一次遍历)
  • 缺点
    • 内存利用率只有50%
    • 对象存活率高时效率低

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

  • 过程
    • 标记阶段:同标记-清除
    • 整理阶段:将所有存活对象向一端移动
    • 清除边界外的内存
  • 优点
    • 无内存碎片
    • 内存利用率高
  • 缺点
    • 移动对象成本高

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

现代 JVM 主要采用此策略,基于对象生命周期特点将堆内存分为不同代:

  • 年轻代(Young Generation)
    • 使用复制算法(如 Serial、ParNew、Parallel Scavenge)
    • 分为 Eden 区和两个 Survivor 区
  • 老年代(Old Generation)
    • 使用标记-清除或标记-整理算法(如 CMS、G1、Serial Old、Parallel Old)
  • 永久代/元空间(Java 8 后为 Metaspace)

3. 现代垃圾收集器

JVM 提供了多种垃圾收集器实现:

  • Serial GC:单线程收集器,适合客户端应用
  • Parallel GC:多线程并行收集,注重吞吐量
  • CMS(Concurrent Mark-Sweep):并发低停顿收集器
  • G1(Garbage-First):面向服务端的收集器,兼顾吞吐量和停顿时间
  • ZGC:JDK11+ 引入,目标极低停顿时间
  • Shenandoah:类似 ZGC 的低停顿收集器

每种收集器都有其适用场景,选择时需要根据应用特点(吞吐量优先/低延迟优先)和硬件条件来决定。