吞吐量 =(总运行时间 − GC 总耗时)÷ 总运行时间 × 100%,其中总运行时间为日志首尾时间戳差值,GC 总耗时为所有 real=xxx secs 值累加,需通过 -XX:+PrintGCDetails 等参数开启详细日志获取。

应用吞吐量不是日志里直接打印的数字,而是通过 GC 日志中累计的耗时数据手动计算出来的。核心公式只有一个:
吞吐量 =(总运行时间 − GC 总耗时)÷ 总运行时间 × 100%
其中“总运行时间”是你应用从启动到当前时刻的真实经过时间,“GC 总耗时”是所有 GC 活动在 STW 阶段实际占用的时间之和(即所有 real=xxx secs 的累加值)。
怎么从 GC 日志里拿到这两个数?
需要开启详细 GC 日志参数,例如:
-
-XX:+PrintGCDetails(输出每次 GC 类型、各阶段耗时) -
-XX:+PrintGCTimeStamps或-XX:+PrintGCDateStamps(带时间戳,方便算总时长) -
-Xloggc:/path/to/gc.log(指定日志路径)
日志中每条 GC 记录末尾类似这样:
[Times: user=0.042 sys=0.005, real=0.047 secs]
这里的 real=0.047 secs 就是本次 GC 的真实停顿时间(STW 时长),把它全部加起来,就是 FGCT + YGCT 的实际值(注意:jstat 中的 YGCT/FGCT 是 CPU 时间总和,而日志 real 才是真实挂起时间,更准确)。
总运行时间怎么确定?
看日志第一行和最后一行的时间戳差值。比如:
- 首行:
2026-09-15T08:22:10.123: [GC... - 末行:
2026-09-15T10:45:33.456: [Full GC...
两者相减就是约 2 小时 23 分钟(≈ 8580 秒)。这个就是分母里的“总运行时间”。
举个实际例子
假设你分析一段 7200 秒(2 小时)的 GC 日志,统计出所有 real= 值加起来是 180 秒:
- GC 总耗时 = 180 秒
- 总运行时间 = 7200 秒
- 吞吐量 = (7200 − 180) ÷ 7200 ≈ 97.5%
如果结果低于 95%,就说明 GC 开销已偏高,需检查堆大小、对象分配速率或回收器配置。
小提醒:别混淆“YGCT/FGCT”和“real”
jstat 输出的 YGCT(年轻代 GC 总耗时)和 FGCT(Full GC 总耗时)是 JVM 线程的 CPU 时间总和,可能包含并行阶段的多线程叠加;而日志中的 real 是单次 STW 的真实挂起时长,对用户体验更关键,也更适合用于吞吐量计算。

















