面试题: Java 中常见的垃圾收集器有哪些?

在 Java 中,垃圾收集器(Garbage Collector, GC)是 JVM 的重要组成部分,负责自动管理内存,回收不再使用的对象。Java 提供了多种垃圾收集器,每种收集器都有其特定的使用场景和优缺点。以下是 Java 中常见的垃圾收集器:


1. Serial 收集器

  • 特点
    • 单线程收集器。
    • 使用 标记-复制算法(新生代)和 标记-整理算法(老年代)。
    • 在垃圾回收时会暂停所有工作线程(Stop-The-World, STW)。
  • 适用场景
    • 单核 CPU 或小型应用。
    • 客户端模式(如 Java 桌面应用)。
  • 启用参数
    • -XX:+UseSerialGC

2. Parallel(吞吐量优先)收集器

  • 特点
    • 多线程收集器。
    • 使用 标记-复制算法(新生代)和 标记-整理算法(老年代)。
    • 目标是最大化吞吐量(Throughput),即减少垃圾回收时间占程序总运行时间的比例。
  • 适用场景
    • 多核 CPU。
    • 适合后台计算任务,对延迟不敏感的应用。
  • 启用参数
    • -XX:+UseParallelGC(新生代)
    • -XX:+UseParallelOldGC(老年代)

3. CMS(Concurrent Mark-Sweep)收集器

  • 特点
    • 以最小化停顿时间为目标。
    • 使用 标记-清除算法(老年代)。
    • 大部分垃圾回收工作与用户线程并发执行。
    • 分为四个阶段:初始标记、并发标记、重新标记、并发清除。
  • 适用场景
    • 对延迟敏感的应用(如 Web 服务)。
    • 老年代垃圾回收。
  • 缺点
    • 会产生内存碎片。
    • 对 CPU 资源敏感。
    • 在 JDK 9 中被标记为废弃,JDK 14 中移除。
  • 启用参数
    • -XX:+UseConcMarkSweepGC

4. G1(Garbage-First)收集器

  • 特点
    • 面向服务端应用的垃圾收集器。
    • 将堆内存划分为多个区域(Region),优先回收垃圾最多的区域(Garbage-First)。
    • 使用 标记-复制算法
    • 目标是平衡吞吐量和低延迟。
    • 支持可预测的停顿时间模型。
  • 适用场景
    • 大内存(堆内存 > 4GB)。
    • 对延迟和吞吐量都有要求的应用。
  • 启用参数
    • -XX:+UseG1GC

5. ZGC(Z Garbage Collector)

  • 特点
    • 低延迟垃圾收集器。
    • 支持超大堆内存(TB 级别)。
    • 停顿时间不超过 10ms。
    • 使用 染色指针(Colored Pointers)和 读屏障(Load Barrier)技术。
  • 适用场景
    • 对延迟要求极高的应用(如实时系统)。
    • 超大堆内存的应用。
  • 启用参数
    • -XX:+UseZGC(JDK 11 引入,JDK 15 后正式支持)

6. Shenandoah 收集器

  • 特点
    • 低延迟垃圾收集器。
    • 与 ZGC 类似,但实现方式不同。
    • 停顿时间与堆大小无关。
    • 使用 读屏障 和 并发压缩 技术。
  • 适用场景
    • 对延迟要求极高的应用。
    • 大堆内存应用。
  • 启用参数
    • -XX:+UseShenandoahGC(JDK 12 引入)

7. Epsilon 收集器

  • 特点
    • 无操作的垃圾收集器。
    • 不进行任何垃圾回收,堆内存耗尽时直接抛出 OutOfMemoryError
  • 适用场景
    • 性能测试或极短生命周期的应用。
  • 启用参数
    • -XX:+UseEpsilonGC

垃圾收集器对比

收集器目标算法适用场景停顿时间
Serial单线程标记-复制/标记-整理单核 CPU、小型应用
Parallel吞吐量优先标记-复制/标记-整理多核 CPU、后台计算任务中等
CMS低延迟标记-清除对延迟敏感的应用
G1平衡标记-复制大内存、对延迟和吞吐量有要求可预测
ZGC极低延迟染色指针超大堆内存、实时系统极短(<10ms)
Shenandoah极低延迟并发压缩大堆内存、对延迟要求极高极短
Epsilon无操作性能测试、极短生命周期应用

如何选择垃圾收集器?

  • 如果应用对延迟不敏感,追求高吞吐量,可以选择 Parallel
  • 如果应用对延迟敏感,且堆内存较小,可以选择 CMS
  • 如果堆内存较大,且需要平衡吞吐量和延迟,可以选择 G1
  • 如果堆内存非常大(TB 级别),且对延迟要求极高,可以选择 ZGC 或 Shenandoah
  • 如果不需要垃圾回收(如性能测试),可以选择 Epsilon
THE END
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容