简体中文
垃圾回收算法速览
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 上的低延迟场景 |
如何选型
- 默认选 G1。 它是 JDK 的默认回收器——可预期的停顿加上不错的吞吐。
- 吞吐优先(批处理、数据管道)? Parallel GC 吞吐最高,但停顿更长。
- 大堆 + 严格延迟 SLO(p99 < 50 毫秒)? ZGC 或 Shenandoah 无论堆多大都能把停顿控制在 10 毫秒以内。
- 微型容器(≤ 512 MB)? Serial GC 往往是冠军——不需要协调多线程。
关键调优参数
| 参数 | 含义 |
|---|---|
-Xms / -Xmx | 初始/最大堆大小。两者设为一致可避免堆伸缩带来的停顿。 |
-Xmn / -XX:NewRatio | 年轻代大小——控制 GC 频率的主要杠杆。 |
-XX:MaxGCPauseMillis | G1 停顿目标(默认 200 毫秒),别设得脱离现实。 |
-XX:MaxMetaspaceSize | 类元数据上限——防止元空间引发的 Full GC。 |
-XX:+DisableExplicitGC | 忽略 System.gc() 调用(先确认没有依赖 Direct ByteBuffer!)。 |
-XX:G1HeapRegionSize | G1 分区大小——巨型对象(Humongous)多时调大。 |
报告中的信号怎么读
Allocation Failure触发的 Young GC 是正常且健康的。System.gc()触发的回收几乎总值得移除。Metadata GC Threshold/ 元空间触发意味着类加载活跃,需要排查。G1 Humongous Allocation表示存在超过分区一半大小的对象——优化数据结构或调大分区。- GC 后堆占用逐次抬升说明有对象一直存活未被回收——参见如何解读分析报告。