说一下 jvm 有哪些垃圾回收器?
JVM 垃圾回收器对比表
垃圾回收器 | 类型 | 工作方式 | 回收方式 | 停顿时间 | 适用场景 | 优点 | 缺点 | 常见问题 | 常见配置 |
---|---|---|---|---|---|---|---|---|---|
Serial GC | 串行 | 单线程,STW | 年轻代:复制算法 老年代:标记-整理 | 长 | 小内存、单核CPU,如桌面应用或嵌入式设备 | 简单高效,适用于单核和小内存环境 | STW 时间长,不适用于多线程、高并发环境 | 长时间停顿影响用户体验 | -XX:+UseSerialGC |
Parallel GC | 并行 | 多线程,STW | 年轻代:复制算法 老年代:标记-整理 | 中等 | 高吞吐量场景,如批量计算、大数据处理 | 适用于多核 CPU,吞吐量高,自动调优 | STW 时间不可预测,容易造成短时性能抖动 | 长时间 Full GC 导致系统暂停 | -XX:+UseParallelGC (年轻代并行)-XX:+UseParallelOldGC (老年代并行) |
CMS GC | 并发 | 多线程,部分 STW | 标记-清除,并发标记、并发清除 | 短(部分长停顿) | 低延迟场景,如在线系统、Web 服务器 | 低停顿时间,可并发清理,适用于交互式应用 | 易产生碎片,导致 Full GC,容易造成“浮动垃圾”问题 | 碎片化严重,需要频繁 Full GC | -XX:+UseConcMarkSweepGC |
G1 GC | 并发并行 | 逻辑分区回收,Region 机制 | 标记-整理 + 复制,Mixed GC 结合年轻代和老年代 | 可调 | 大内存、低停顿场景,如大型 Web 服务器 | 停顿可预测,回收均衡,减少碎片 | 配置复杂,Full GC 开销大,调优较难 | Full GC 触发后暂停时间较长 | -XX:+UseG1GC |
ZGC | 并发并行 | 读屏障、并发回收 | 并发标记-复制 | 极短(<1ms) | 超大内存、低延迟,如云计算、金融交易系统 | STW 低于 1ms,可扩展至 16TB 内存 | 内存占用大,支持的 JDK 版本有限,调优难度大 | 内存占用过大时可能影响吞吐量 | -XX:+UseZGC -XX:ZUncommitDelay=300 (内存回收优化) |
Shenandoah GC | 并发并行 | 并发标记、并发清理 | 标记-清除 + 复制 | 极短 | 超大内存、低延迟,如电商、游戏服务器 | 低延迟(<10ms),并发回收,适用于交互式应用 | 小内存环境下表现不如 CMS/G1,CPU 占用较高 | 高 CPU 使用率,影响吞吐量 | -XX:+UseShenandoahGC |
补充说明
- STW(Stop The World):指垃圾回收期间所有应用线程必须暂停,影响系统响应时间。
- 吞吐量(Throughput):衡量 GC 回收效率,吞吐量高的 GC 适用于计算密集型任务,但可能会有较长的 STW 停顿。
- 低延迟(Low Latency):适用于需要极短暂停时间的应用,如金融、云计算、实时系统。
- G1/ZGC/Shenandoah 适用于大内存环境,尤其是 ZGC 可支持 16TB 内存,G1 可平衡吞吐与停顿。
- 停顿时间:指的是垃圾回收暂停应用程序的时间。较长意味着回收期间会发生较长时间的“Stop The World”事件。
- 适用场景:指各个回收器的典型应用环境,如服务器应用、多核CPU或客户端应用等。
- 优点:列出了每个回收器在特定场景下的优势。
- 缺点:列出了每个回收器可能面临的挑战或局限。
这个表格简要地比较了常见的垃圾回收器,帮助你选择合适的垃圾回收器时参考。