最可靠方式是JVM启动时切换GC算法并运行标准化负载,控制变量、多次运行取中位数,用真实业务逻辑测试,固定堆大小和预热轮数,禁用动态编译干扰,启用对应GC日志,通过总耗时与GC总耗时计算吞吐量比。

直接在 JVM 启动时切换 GC 算法并运行标准化负载,配合监控指标对比吞吐量,是最可靠的方式。关键不是“测一次”,而是控制变量、多次运行、看稳定值。
准备可复现的测试场景
吞吐量依赖实际工作负载,不能靠空循环或简单对象分配来模拟。建议:
- 用真实业务逻辑片段(如 JSON 解析+计算+缓存写入),封装成独立方法反复调用
- 固定总请求数(如 10 万次)和预热轮数(至少 3 轮),避免 JIT 干扰
- 禁用动态编译优化干扰:添加 -XX:-TieredStopAtLevel1 或统一用 C2 编译器
- 确保每次测试前堆内存干净,可用 -XX:+AlwaysPreTouch 提前触碰页,减少运行中缺页中断
指定 GC 并启用吞吐量统计
每轮只启用一种 GC 算法,并打开详细日志与计时标记:
- Parallel GC(吞吐优先):-XX:+UseParallelGC -XX:GCTimeRatio=99 -XX:+PrintGCDetails -Xloggc:gc_parallel.log
- G1 GC(平衡型):-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xloggc:gc_g1.log
- ZGC(低延迟,高吞吐兼顾):-XX:+UseZGC -Xloggc:gc_zgc.log -Xlog:gc*,safepoint
注意:JDK 版本决定可用选项(ZGC 需 JDK 11+,G1 是 JDK 9+ 默认);GCTimeRatio=99 表示目标是 99% 时间跑用户代码、1% 用于 GC,这是吞吐量的核心调控参数。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
提取并对比吞吐量数据
吞吐量不看单次 GC 耗时,而看整体单位时间完成的有效工作量:
- 记录测试总耗时(从 start 到 end 的 System.nanoTime)
- 统计成功处理请求数(非吞吐量 = 请求总数 / 总耗时)
- 从 GC 日志中解析出总 GC 时间(可用 grep "GC pause" gc_*.log | awk '{sum += $5} END {print sum}')
- 计算实际吞吐量比:用户代码时间 / (用户代码时间 + GC 时间),即 1 − (总 GC 时间 / 总耗时)
例如:总耗时 62.3 秒,GC 总耗时 0.82 秒 → 吞吐量 ≈ 98.68%
排除干扰,确认结果可信
相同硬件、相同 JVM 参数(仅 GC 类型不同)、关闭后台服务(如 cron、监控 agent),并满足:
- 每组至少运行 5 轮,取中位数而非平均值(防异常毛刺)
- 堆内存大小固定(如 -Xms4g -Xmx4g),避免扩容导致额外 STW
- 观察 Full GC 次数:若某算法频繁触发 Full GC,其吞吐量数据不可信,需先调优或排除该算法
- 用 jstat -gc <pid> 实时验证是否真正在用目标 GC(如输出含 PSYoungGen 即 Parallel,G1OldGen 即 G1)


















