# 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 GC
或G1
。 - 低延迟优先:如果应用对延迟要求较高,使用
CMS
、G1
、ZGC
或Shenandoah
。 - 低内存消耗:
Serial GC
和Parallel GC
更适合资源较少的环境。
# 8. 各回收器的对比
回收器 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
Serial GC | 小型应用,单核 CPU 环境 | 实现简单,开销小 | 单线程,停顿时间长 |
Parallel GC | 高吞吐量应用 | 吞吐量高,多线程并行 | 停顿时间较长 |
CMS | 低延迟应用(实时要求高) | 并发标记、清除,停顿时间较短 | 可能产生碎片,频繁 Full GC |
G1 | 大内存、低延迟应用 | 控制停顿时间,减少 Full GC | CPU 占用较高,配置复杂 |
ZGC | 大内存,低延迟要求 | 极低停顿时间,支持 TB 级堆 | 适用版本较新,稳定性差 |
Shenandoah GC | 大内存,低延迟要求 | 低延迟,高并发 | CPU 占用较高,适用范围小 |
# 深入追问
- 在什么情况下需要在
G1
和ZGC
之间做选择?它们各自的优缺点如何权衡? - 在高吞吐量应用中,如何避免
Parallel GC
的停顿时间对性能的影响? - 如何根据应用的实时性能要求调整 JVM 垃圾回收器的参数?
# 相关面试题
- 如何配置 JVM 来优化垃圾回收性能?
- 讲解 G1 GC 的工作原理,并与 CMS 做对比。