-xx:gctimeratio=n是parallel scavenge收集器设定吞吐量目标的核心参数,表示允许gc时间占比上限为1/(n+1),例如n=99时目标吞吐量≥99%,n=19时≥95%,其值为正整数,默认99,属优化目标而非硬性保证。

XX:GCTimeRatio 是 Parallel Scavenge 垃圾收集器中用于**设定吞吐量目标的核心参数**,它不直接指定“吞吐量百分比”,而是通过控制 GC 时间占总运行时间的比例,间接表达系统期望的吞吐量水平。
参数含义与数学关系
该参数格式为:-XX:GCTimeRatio=N,其中 N 是一个正整数(默认值为 99)。它定义了:
目标是让 GC 时间 / (GC 时间 + 应用线程运行时间) ≤ 1 / (N + 1)
换言之:
- 若设
GCTimeRatio=99→ 目标 GC 时间占比 ≤ 1/100 = 1% → 吞吐量目标 ≥ 99% - 若设
GCTimeRatio=19→ 目标 GC 时间占比 ≤ 1/20 = 5% → 吞吐量目标 ≥ 95% - 若设
GCTimeRatio=3→ 目标 GC 时间占比 ≤ 1/4 = 25% → 吞吐量目标 ≥ 75%
注意:这是 JVM 的**优化目标**,不是硬性保证。实际吞吐量取决于堆大小、对象分配速率、晋升行为等运行时因素。
Parallel Scavenge 如何使用该参数
Parallel Scavenge 是一种以**吞吐量优先**为目标的垃圾收集器。它会动态调整:
- 年轻代大小(在合理范围内)
- 各代空间比例(如
-XX:SurvivorRatio影响 S 区大小) - 是否触发 Full GC(避免因老年代碎片导致频繁 GC)
所有这些调整都服务于一个目标:在满足 GCTimeRatio 约束的前提下,尽可能减少 GC 总耗时、提升应用执行时间占比。JVM 内部通过统计最近若干次 GC 的耗时与应用停顿间隙,估算当前吞吐量,并反馈调节内存布局。
设置建议与常见误区
不要盲目追求高 GCTimeRatio(如设为 999),需结合实际负载权衡:
- 过高的值(如 999)→ 要求 GC 时间占比 ≤ 0.1%,可能导致年轻代被调得过大,单次 Minor GC 停顿显著拉长,影响响应性
- 过低的值(如 3)→ 虽降低停顿压力,但频繁 GC 会浪费 CPU,且可能因晋升过快引发老年代压力
- 推荐从默认 99(即 99% 吞吐量)起步,在压测中观察 GC 日志中的
GC time和application time实际占比,再微调 - 配合
-XX:MaxGCPauseMillis使用时需注意:Parallel Scavenge 不支持该参数(那是 G1/CMS 的目标),设了也无效
如何验证是否达标
启用 GC 日志(如 -Xlog:gc*:file=gc.log:time,tags,level),关注每轮 GC 记录中的耗时,并做周期性汇总:
- 统计一段时间内(如 5 分钟)所有 GC 总耗时 T_gc
- 统计同一时间段内 JVM 进程真实运行时长 T_total(可用
uptime或监控工具获取) - 计算实际 GC 时间占比 = T_gc / T_total
- 对比是否 ≤ 1 / (GCTimeRatio + 1);若持续超标,说明当前堆配置无法支撑该吞吐目标,需增大堆或优化对象生命周期











