-XX:SurvivorRatio表示Eden区与单个Survivor区的容量比,默认值为8,对应Eden:S0:S1=8:1:1;该参数直接影响Minor GC时对象复制行为、晋升时机及年轻代内存布局。

JVM 通过 -XX:SurvivorRatio 参数直接设定年轻代中 Eden 区与单个 Survivor 区的容量比例,从而影响对象在 Minor GC 后的复制行为和内存布局。
SurvivorRatio 的含义和计算方式
该参数表示 Eden 区大小与一个 Survivor 区大小的比值。默认值通常是 8(不同 JVM 版本可能略有差异),即:
Eden : Survivorfrom : Survivorto = 8 : 1 : 1
整个年轻代被划分为 10 份:Eden 占 8 份,两个 Survivor 各占 1 份。
- 若设置
-XX:SurvivorRatio=4,则 Eden 占 4 份,每个 Survivor 各占 1 份,年轻代共分 6 份 - 若设置
-XX:SurvivorRatio=10,则 Eden 占 10 份,每个 Survivor 各占 1 份,共 12 份 - 注意:JVM 总是维护两个 Survivor 区(from/to),但同一时刻仅一个可用;参数控制的是“单个”Survivor 的大小
调整 SurvivorRatio 对 GC 行为的影响
改变该值会直接影响对象晋升时机、GC 频率和 Survivor 空间利用率:
- 增大 SurvivorRatio(如设为 12)→ Eden 变大、Survivor 变小 → 更多对象在第一次 Minor GC 后就因 Survivor 放不下而直接晋升到老年代
- 减小 SurvivorRatio(如设为 3)→ Survivor 变大 → 更多对象能在 Survivor 中多存活几轮,延迟晋升,但可能增加复制开销和 GC 暂停时间
- 过小的 Survivor 容易导致“Survivor 空间不足”,触发 担保机制,把部分对象提前晋升,甚至引发 Full GC
如何验证和观察效果
启动时加上 GC 日志参数,结合实际日志分析比例是否生效:
- 添加
-XX:+PrintGCDetails -Xloggc:gc.log(JDK 8)或-Xlog:gc*(JDK 9+) - 查看每次 Minor GC 日志中的年轻代各区域大小,例如:
PSYoungGen total 102400K, used 45672K [0x00000007b5500000, 0x00000007baa00000, 0x00000007baa00000)
其中 Eden 和 Survivor 大小之比应与设置的 SurvivorRatio 一致 - 也可用
jstat -gc <pid>实时查看 S0C/S1C(Survivor 容量)与 EC(Eden 容量)的比值
调优建议和常见误区
这个参数不是孤立有效的,需结合应用对象生命周期特征来调整:
立即学习“Java免费学习笔记(深入)”;
- 短生命周期对象居多 → 可适当增大 SurvivorRatio,减少 Survivor 浪费
- 存在较多中等生命周期对象(存活 2–5 次 GC)→ 可减小 SurvivorRatio,避免频繁晋升
- 不要盲目调小 SurvivorRatio 来“留住对象”,这可能导致 Survivor 区频繁溢出,反而加剧老年代压力
- 现代 JVM(如 ZGC、Shenandoah)对年轻代结构管理更智能,该参数影响减弱,但在 Parallel GC、CMS、G1 中仍有效


















