-XX:SurvivorRatio参数通过Eden与单个Survivor区的比值(如8表示Eden占8份、每个Survivor各1份)控制新生代内存划分,需配合-Xmn指定新生代总量才能确定绝对大小,且仅对Parallel、CMS等分代GC有效。

直接通过 -XX:SurvivorRatio 参数控制 Eden 与每个 Survivor 区的比例,是调整二者内存大小最常用、最有效的方式。
用 SurvivorRatio 控制比例关系
该参数定义的是 Eden 区大小 ÷ 单个 Survivor 区大小 的比值。新生代总空间被划分为 SurvivorRatio + 1 + 1 份(即 Eden + S0 + S1),其中 Eden 占 SurvivorRatio 份,每个 Survivor 各占 1 份。
- 设
-XX:SurvivorRatio=8,新生代共 10 份 → Eden 占 80%,每个 Survivor 各占 10% - 设
-XX:SurvivorRatio=4,新生代共 6 份 → Eden 占 66.7%,每个 Survivor 各占 16.7% - 设
-XX:SurvivorRatio=2,新生代共 4 份 → Eden 占 50%,每个 Survivor 各占 25%
配合 -Xmn 显式指定新生代总大小
单独调 SurvivorRatio 不会改变新生代总量,它只决定内部划分。要真正控制 Eden 和 Survivor 的绝对大小,需先固定新生代容量:
-
-Xmn256m:将新生代初始和最大值都设为 256MB(等价于-XX:NewSize=256m -XX:MaxNewSize=256m) - 再叠加
-XX:SurvivorRatio=8→ Eden = 204.8MB,每个 Survivor = 25.6MB - 若改用
-XX:SurvivorRatio=4→ Eden ≈ 170.7MB,每个 Survivor ≈ 42.7MB
根据应用特征选择合理值
没有“最优”值,只有“更合适”的值,关键看对象生命周期和 GC 日志表现:
立即学习“Java免费学习笔记(深入)”;
- 大量短命对象(如 Web 请求临时对象)→ 增大
SurvivorRatio(如 10~15),扩大 Eden,减少 Minor GC 次数 - 较多中短期存活对象(如缓存、DTO)→ 减小
SurvivorRatio(如 4~6),增大 Survivor,避免过早晋升到老年代 - 观察 GC 日志中的
Desired survivor size和实际survivor used,若长期接近上限或频繁溢出(to-space overflow),说明 Survivor 太小,应调低该值
注意 GC 类型的兼容性
该参数仅对基于分代复制算法的垃圾收集器生效:
- ✅ Parallel GC、CMS GC:默认支持,
SurvivorRatio=8是典型配置 - ❌ G1 GC、ZGC、Shenandoah:不使用固定 Eden/Survivor 划分,此参数被忽略
- 可通过
java -XX:+PrintFlagsFinal -version | grep SurvivorRatio查看当前 JVM 实际生效值


















