-xx:survivorratio通过设定eden区与单个survivor区的比例(如8表示eden:s0:s1=8:1:1)来划分新生代内部空间,不改变新生代总量;调小该值增大survivor、延缓晋升但可能增加gc频率,调大则扩大eden、降低gc次数,需结合gc日志中晋升年龄和触发频率优化。

XX:SurvivorRatio 不直接影响“吞吐量”本身,而是通过调控年轻代内部 Eden 与 Survivor 区的空间比例,间接影响 Minor GC 的频率、单次耗时和对象晋升行为,最终作用于应用的实际吞吐表现。
它怎么决定年轻代内存分配结构
该参数定义的是 Eden 区与单个 Survivor 区的大小比值。例如:
-
-XX:SurvivorRatio=8→ Eden : S0 : S1 = 8 : 1 : 1 → Eden 占新生代 80%,每个 Survivor 各占 10% -
-XX:SurvivorRatio=4→ Eden : S0 : S1 = 4 : 1 : 1 → Eden 占 66.7%,每个 Survivor 占 16.7%
注意:它只改变年轻代内部划分,不改变年轻代总大小(那是 -Xmn 或 -XX:NewRatio 控制的)。
调小 SurvivorRatio(如从 8 改为 4)意味着什么
Survivor 区变大,Eden 区相应缩小。这适合对象平均存活时间较长的场景:
- 更多存活对象能在 Survivor 区多熬几次 GC,延迟晋升到老年代
- 减少因 Survivor 空间不足导致的“早晋升”(Premature Promotion)
- 但 Eden 变小 → 更容易填满 → Minor GC 频率上升,可能拖累吞吐
调大 SurvivorRatio(如从 8 改为 12)通常更利于吞吐
Eden 区扩大,Survivor 区缩小(但绝对容量未必减小,取决于新生代总大小):
- Eden 越大,短期对象越不容易触发 Minor GC → GC 次数下降
- 只要 Survivor 足够容纳“真正能活过一次 GC”的对象,就不会引发早晋升
- 典型高吞吐场景(如 Web API、事件处理)推荐值:8~10,甚至 12(需配合 GC 日志验证)
关键看 GC 日志里的两个信号
调优不能凭经验拍板,要靠日志反馈:
- 如果日志中频繁出现
Desired survivor size XXX, new threshold Y (max Y)后紧跟tenuring distribution显示大量年龄为 1 的对象直接晋升 → Survivor 太小,应 调小 SurvivorRatio 值(即增大 Survivor) - 如果 Young GC 平均间隔短于 1 秒,且每次都是 Eden 几乎 100% 才触发 → Eden 太小,应 调大 SurvivorRatio 值(即增大 Eden)










