Skip to content

垃圾回收算法速览

EasyGC 支持的各回收器的特点与选型建议。

各回收器对比

回收器开启参数策略典型停顿适用场景
Serial-XX:+UseSerialGC单线程、分代100 毫秒 – 秒级小堆、单核容器、批处理小工具
Parallel-XX:+UseParallelGC多线程并行、分代50 毫秒 – 秒级追求最大吞吐,批处理/数仓,延迟不敏感
CMS-XX:+UseConcMarkSweepGC老年代 Mostly 并发10 – 100 毫秒旧一代低延迟服务(Java 14 已移除)
G1-XX:+UseG1GC分区(Region)、并发标记10 – 200 毫秒(有目标值)Java 9 起的默认回收器,吞吐与延迟均衡
ZGC-XX:+UseZGC并发、染色指针< 1 毫秒超大堆 + 严格 SLO(Java 15+)
Shenandoah-XX:+UseShenandoahGC并发、转发指针< 10 毫秒OpenJDK 上的低延迟场景

如何选型

  1. 默认选 G1。 它是 JDK 的默认回收器——可预期的停顿加上不错的吞吐。
  2. 吞吐优先(批处理、数据管道)? Parallel GC 吞吐最高,但停顿更长。
  3. 大堆 + 严格延迟 SLO(p99 < 50 毫秒)? ZGC 或 Shenandoah 无论堆多大都能把停顿控制在 10 毫秒以内。
  4. 微型容器(≤ 512 MB)? Serial GC 往往是冠军——不需要协调多线程。

关键调优参数

参数含义
-Xms / -Xmx初始/最大堆大小。两者设为一致可避免堆伸缩带来的停顿。
-Xmn / -XX:NewRatio年轻代大小——控制 GC 频率的主要杠杆。
-XX:MaxGCPauseMillisG1 停顿目标(默认 200 毫秒),别设得脱离现实。
-XX:MaxMetaspaceSize类元数据上限——防止元空间引发的 Full GC。
-XX:+DisableExplicitGC忽略 System.gc() 调用(先确认没有依赖 Direct ByteBuffer!)。
-XX:G1HeapRegionSizeG1 分区大小——巨型对象(Humongous)多时调大。

报告中的信号怎么读

  • Allocation Failure 触发的 Young GC 是正常且健康的。
  • System.gc() 触发的回收几乎总值得移除。
  • Metadata GC Threshold / 元空间触发意味着类加载活跃,需要排查。
  • G1 Humongous Allocation 表示存在超过分区一半大小的对象——优化数据结构或调大分区。
  • GC 后堆占用逐次抬升说明有对象一直存活未被回收——参见如何解读分析报告