直接对比垃圾回收器性能需控制变量、统一环境并采集可比指标:固定jdk版本、堆内存、禁用自适应策略与动态编译,逐个启用serial/parallel/g1/zgc,用相同压测脚本记录stw、吞吐量及停顿等日志数据。

直接对比不同垃圾回收器的性能,核心是控制变量、采集可比指标,并在相同业务负载下运行。不靠猜测,靠日志和工具说话。
准备统一测试环境
避免硬件或配置干扰结果:
- 固定 JVM 版本(如 JDK 17 或 JDK 21),禁用动态编译优化(-XX:-TieredStopAtLevel=1)
- 堆内存大小统一设置(如 -Xms4g -Xmx4g),关闭自适应策略(-XX:-UseAdaptiveSizePolicy)
- 关闭元空间自动扩容(-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m)
- 确保 OS 层无其他内存密集型进程干扰,最好在干净的 Linux 容器或虚拟机中运行
逐个启用回收器并记录关键指标
每轮只启用一种回收器,使用相同压测脚本(如 JMH 循环创建/丢弃对象,或模拟 HTTP 请求的 Spring Boot 小应用):
- Serial:-XX:+UseSerialGC → 观察单线程 GC 耗时与 STW 频率
- Parallel:-XX:+UseParallelGC → 关注吞吐量(-XX:+PrintGCDetails -Xloggc:gc_parallel.log)
- G1:-XX:+UseG1GC → 加 -XX:MaxGCPauseMillis=200 测试停顿可控性
- ZGC(JDK 11+):-XX:+UseZGC → 看是否真能维持 -Xlog:gc*:gc_zgc.log:time)
每轮运行至少 5 分钟,跳过前 60 秒预热期,只统计稳定期的 GC 数据。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
重点采集三类数据
不能只看“快不快”,要分维度验证:
- 停顿时间:每次 GC 的 Stop-The-World 毫秒数(日志中 pause 或 GC pause 字段),统计 P90/P99 值
- 吞吐量:应用实际工作时间占比 = 总运行时间 / (总运行时间 + GC 总耗时),从 GC 日志累加计算
- 内存行为:老年代增长速率、Full GC 是否发生、元空间是否泄漏(对比 Metaspace 行变化)
用工具辅助验证而非仅靠日志
日志易漏细节,建议搭配:
-
jstat -gc
1000 :实时观察各代内存使用与 GC 次数(每秒刷新) - JFR(Java Flight Recorder):开启 -XX:+FlightRecorder -XX:StartFlightRecording=duration=120s,filename=recording.jfr,可回放 GC 事件、线程阻塞、内存分配热点
- GCViewer 或 GCEasy:上传 gc.log 自动生成吞吐量、停顿分布、内存趋势图
例如:Parallel 回收器可能吞吐量高但某次 Full GC 停顿达 800ms;ZGC 停顿稳定在 3ms 内,但整体吞吐略低——这种权衡必须实测才能看清。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










