-xx:survivorratio=8表示eden区与单个survivor区容量比为8:1,即新生代中eden占8/10、每个survivor各占1/10;该值直接影响对象在survivor区的存活轮次和晋升老年代时机,过小易致溢出晋升,过大则加剧minor gc频率。

设置 -XX:SurvivorRatio 是调节年轻代中 Eden 与 Survivor 区大小关系的关键参数,直接影响对象在 Survivor 区的“存活轮次”和晋升老年代的时机。
SurvivorRatio 的实际含义
该参数定义的是 Eden 区与单个 Survivor 区(S0 或 S1)的容量比值。例如:
- -XX:SurvivorRatio=8 表示 Eden : SurvivorFrom : SurvivorTo = 8 : 1 : 1,即年轻代被划分为 10 等份,Eden 占 8 份,两个 Survivor 各占 1 份;
- 若年轻代总大小为 400MB,则 Eden = 320MB,每个 Survivor = 40MB;
- 该比例不控制 Survivor 总量占比,而是控制 Eden 与“一个 Survivor”的相对大小。
为什么它影响对象晋升老年代的速度
对象在 Minor GC 后若仍存活,会从 Eden 或 From 区复制到 To 区,并年龄 +1。当年龄达到 -XX:MaxTenuringThreshold(默认 15),就会晋升老年代。但还有一个隐性条件:如果 Survivor 区空间不足,无法容纳下一轮要复制的存活对象,JVM 会直接将部分对象提前晋升——这叫 担保失败(Promotion Failure)或 Survivor 溢出晋升。
- Survivor 区太小(比如 SurvivorRatio=16,每个 Survivor 仅占年轻代 1/18),很快就会装满,导致大量对象“被迫”提前进入老年代;
- Survivor 区足够大(如 SurvivorRatio=4 或 6),能容纳更多存活对象多轮 GC,让短生命周期对象自然死亡,减少无效晋升;
- 注意:过大的 Survivor(如 SurvivorRatio=2)会严重压缩 Eden,反而增加 Minor GC 频率,得不偿失。
如何合理设置 SurvivorRatio
没有统一最优值,需结合应用对象生命周期特征和 GC 日志分析:
- 观察 GC 日志中每次 Minor GC 后 Survivor 区的占用率(如 “PSYoungGen: 320000K->38400K(360000K)” 中的 38400K/360000K ≈ 10.7%);
- 若 Survivor 使用率长期高于 70%,说明空间紧张,可尝试调小 SurvivorRatio(增大 Survivor 容量);
- 若 Eden 区 GC 频繁(如间隔小于 1 秒)且 Survivor 始终空闲,说明 Eden 过小,应适当增大 SurvivorRatio;
- 常见稳妥取值范围是 6~8,对多数中等生命周期对象的应用较平衡。
配合其他参数协同优化
SurvivorRatio 不是孤立生效的,需与以下参数联动:
- -XX:MaxTenuringThreshold:限制最大年龄阈值,避免长生命周期对象卡在 Survivor 区;
- -XX:+UseAdaptiveSizePolicy(默认开启):JVM 会动态调整 SurvivorRatio 和阈值,此时显式设置可能被覆盖,建议先关闭该选项再精细调优;
- -XX:TargetSurvivorRatio(HotSpot 特有):设定 Survivor 区期望使用率(如 50),辅助自适应策略更精准保留对象。










