# 20. JVM垃圾回收器有哪些,有何区别?

# 标准答案

JVM 中常见的垃圾回收器有串行垃圾回收器(Serial GC)、并行垃圾回收器(Parallel GC)、CMS(Concurrent Mark-Sweep)垃圾回收器、G1(Garbage First)垃圾回收器、ZGC(Z Garbage Collector)和 Shenandoah GC。它们的主要区别在于回收策略、停顿时间、并发性、吞吐量等方面。具体选择哪个回收器,通常取决于应用场景的需求,如响应时间优先、吞吐量优先等。

# 答案解析

JVM 的垃圾回收器是负责自动管理内存的机制,旨在通过释放不再使用的对象来优化内存的使用。不同的回收器采用不同的算法和策略,适用于不同的场景。常见的垃圾回收器包括:

# 1. 串行垃圾回收器(Serial GC)

  • 特性:串行垃圾回收器使用单线程进行垃圾回收,适用于单核机器或内存小、CPU资源有限的场景。

  • 使用场景:适合于小型应用,或者对响应时间要求不高的应用。

  • 优点:实现简单、开销小。

  • 缺点:单线程执行,GC 时会导致长时间停顿,性能差。

    启用方式:

    -XX:+UseSerialGC
    
    1

# 2. 并行垃圾回收器(Parallel GC)

  • 特性:并行垃圾回收器使用多线程并行处理垃圾回收,减少了单线程的瓶颈,适用于需要高吞吐量的应用。

  • 使用场景:适合大多数通用应用,特别是大内存、要求吞吐量较高的系统。

  • 优点:通过多线程加速垃圾回收过程,提高吞吐量。

  • 缺点:虽然并行化,但 GC 仍然是停顿式的,可能导致较长的停顿。

    启用方式:

    -XX:+UseParallelGC
    
    1

# 3. CMS(Concurrent Mark-Sweep)垃圾回收器

  • 特性:CMS 通过并发标记和清除的方式,减少了停顿时间。标记和清理阶段可以与应用程序并发进行,避免了全停顿。

  • 使用场景:适合对停顿时间敏感、需要实时响应的应用(如电商、金融系统)。

  • 优点:减少了停顿时间,适合低延迟要求的场景。

  • 缺点:由于并发标记和清除,可能产生碎片化,并且某些情况下可能导致 Full GC,性能波动较大。

    启用方式:

    -XX:+UseConcMarkSweepGC
    
    1

# 4. G1(Garbage First)垃圾回收器

  • 特性:G1 是为大内存应用而设计的,目的是平衡停顿时间和吞吐量。它将堆分为多个区域,通过分阶段回收来降低单次 GC 的停顿时间。

  • 使用场景:适用于大内存应用,特别是要求低停顿、高吞吐量的系统。

  • 优点:相比 CMS,G1 更精确地控制停顿时间,能够动态调整回收策略,减少 Full GC 的发生。

  • 缺点:相比 CMS,G1 可能会更消耗 CPU 和内存资源。

    启用方式:

    -XX:+UseG1GC
    
    1

# 5. ZGC(Z Garbage Collector)

  • 特性:ZGC 是一个低延迟、高并发的垃圾回收器,它通过并发标记和并行清理实现几乎不产生停顿。它设计上支持处理非常大的堆(可达 TB 级别)。

  • 使用场景:适用于对延迟要求非常高的应用,如金融、实时大数据处理等。

  • 优点:极低的停顿时间,支持大内存应用。

  • 缺点:较新的回收器,适用于 JDK 11 及以上版本,可能在一些老版本上不稳定。

    启用方式:

    -XX:+UseZGC
    
    1

# 6. Shenandoah GC

  • 特性:Shenandoah GC 是类似于 ZGC 的低延迟垃圾回收器,致力于减少 GC 停顿时间。它通过并行和并发的方式来回收内存,且能够处理更大的堆。

  • 使用场景:适用于对延迟要求严格的应用,尤其是大内存应用。

  • 优点:低延迟,适合大内存场景。

  • 缺点:与其他回收器相比,CPU 占用较高,适用范围相对较小。

    启用方式:

    -XX:+UseShenandoahGC
    
    1

# 7. 总结:不同垃圾回收器的适用场景

  • 吞吐量优先:如果应用对吞吐量要求较高,使用 Parallel GCG1
  • 低延迟优先:如果应用对延迟要求较高,使用 CMSG1ZGCShenandoah
  • 低内存消耗Serial GCParallel GC 更适合资源较少的环境。

# 8. 各回收器的对比

回收器 适用场景 优点 缺点
Serial GC 小型应用,单核 CPU 环境 实现简单,开销小 单线程,停顿时间长
Parallel GC 高吞吐量应用 吞吐量高,多线程并行 停顿时间较长
CMS 低延迟应用(实时要求高) 并发标记、清除,停顿时间较短 可能产生碎片,频繁 Full GC
G1 大内存、低延迟应用 控制停顿时间,减少 Full GC CPU 占用较高,配置复杂
ZGC 大内存,低延迟要求 极低停顿时间,支持 TB 级堆 适用版本较新,稳定性差
Shenandoah GC 大内存,低延迟要求 低延迟,高并发 CPU 占用较高,适用范围小

# 深入追问

  • 在什么情况下需要在 G1ZGC 之间做选择?它们各自的优缺点如何权衡?
  • 在高吞吐量应用中,如何避免 Parallel GC 的停顿时间对性能的影响?
  • 如何根据应用的实时性能要求调整 JVM 垃圾回收器的参数?

# 相关面试题

  • 如何配置 JVM 来优化垃圾回收性能?
  • 讲解 G1 GC 的工作原理,并与 CMS 做对比。