JVM 中常见的垃圾回收器有哪些?它们的适用场景?
1 个回答
入体冰凉的月光,都比不上你绝情的目光。松林JVM 的垃圾回收器很多,但常见的可以分成 **几代经典收集器** 和 **新一代低延迟收集器**。 ## 1. 串行收集器(Serial / Serial Old) * **特点**:单线程执行 GC(无论新生代还是老年代),GC 时会 Stop-The-World。 * **适用场景**: * 单核/小内存机器(如早期桌面应用、测试环境)。 * 简单、内存占用低,但延迟较高,不适合大规模服务端。 * **参数**:`-XX:+UseSerialGC`。 ## 2. 并行收集器(Parallel Scavenge / Parallel Old) * **特点**:多线程并行回收,追求 **高吞吐量**(应用运行时间 / 总时间尽可能大)。 * **适用场景**: * **批处理、离线计算**,对吞吐要求高,但对单次延迟不敏感。 * 典型:大数据计算任务。 * **参数**:`-XX:+UseParallelGC`。 ## 3. CMS(Concurrent Mark-Sweep) * **特点**: * 老年代并发回收(标记-清除算法),减少长时间的 Stop-The-World。 * 追求**低延迟**,但会产生碎片。 * **适用场景**: * 对 **响应时间敏感** 的服务(Web 服务、在线交易)。 * 但维护成本较高,在 JDK 9 之后被标记为 **废弃**。 * **参数**:`-XX:+UseConcMarkSweepGC`。 ## 4. G1(Garbage First) * **特点**: * 把堆划分成多个 Region,按收益优先(Garbage First)选择回收。 * 支持并发标记和混合收集,既能控制 **延迟**,又能兼顾 **吞吐**。 * 支持可预测的停顿时间(`-XX:MaxGCPauseMillis`)。 * **适用场景**: * JDK 9+ 默认收集器(在服务端)。 * 大堆内存(几 GB \~ 数百 GB)环境,要求 **较低延迟** 和 **较好吞吐量的平衡**。 * **参数**:`-XX:+UseG1GC`。 ## 5. ZGC(JDK 11 引入) * **特点**: * 超低延迟(STW 时间通常 < 10ms)。 * 基于 Region、染色指针(Colored Pointers),支持 **TB 级堆**。 * 高并发,几乎所有阶段都和应用线程并发执行。 * **适用场景**: * 对 **延迟极度敏感** 的应用(金融交易、在线广告竞价、实时分析)。 * 大堆内存场景(数百 GB \~ TB)。 * **参数**:`-XX:+UseZGC`。 ## 6. Shenandoah(Red Hat 主导,JDK 12 起) * **特点**: * 和 ZGC 一样追求低延迟,几乎所有 GC 阶段并发。 * 引入 **并发压缩(Concurrent Compaction)**,解决碎片问题。 * **适用场景**: * **低延迟、大内存** 应用。 * 在 Red Hat 系生态(如 OpenJDK with Shenandoah、RHEL)里更常见。 * **参数**:`-XX:+UseShenandoahGC`。 ## 总结对比 | 收集器 | 特点 | 适用场景 | | ---------- | ----------- | ----------------- | | Serial | 单线程,简单 | 小内存、单核、测试环境 | | Parallel | 多线程,高吞吐 | 批处理、后台任务 | | CMS | 并发,低停顿,可能碎片 | Web 服务,对延迟敏感 | | G1 | 分区,延迟可控,平衡型 | 大堆,服务端通用,JDK9+ 默认 | | ZGC | 超低停顿,TB 级堆 | 金融、电商实时场景 | | Shenandoah | 并发压缩,低延迟 | 大内存、低延迟场景 |发布于 2025-08-18 12:36 •IP属地 云南举报评论收藏
公众号进入网站体验更佳

