默认比例为8:1:1,即Eden区占新生代8份、每个Survivor区各占1份;-XX:SurvivorRatio=8表示Eden与单个Survivor区容量比,仅对Parallel GC和CMS生效,G1/ZGC不适用。

Java 中新生代 Eden 和 Survivor 区域的比例,主要通过 -XX:SurvivorRatio 参数控制,它决定 Eden 与单个 Survivor 区的大小比值。默认值通常是 8(即 Eden : S0 : S1 = 8 : 1 : 1),但实际调优需结合应用对象生命周期、GC 频率和晋升行为综合判断。
理解 SurvivorRatio 的真实含义
-XX:SurvivorRatio=N 表示 Eden 区容量与一个 Survivor 区(S0 或 S1)的容量之比,不是与两个 Survivor 总和之比。例如:
- -XX:SurvivorRatio=6 → Eden : S0 : S1 = 6 : 1 : 1(新生代共分 8 份)
- -XX:SurvivorRatio=4 → Eden : S0 : S1 = 4 : 1 : 1(新生代共分 6 份)
- -XX:SurvivorRatio=10 → Eden : S0 : S1 = 10 : 1 : 1(新生代共分 12 份)
注意:该参数仅对 Parallel GC 和 CMS 生效;G1 和 ZGC 不使用固定比例的 Survivor 区,它们动态管理内存区域,不响应 SurvivorRatio。
什么时候需要调整这个比例?
调优不是为了“设得更小或更大”,而是匹配对象存活特征:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 若每次 Minor GC 后,大量对象被复制到 Survivor 区,但很快又在下一次 GC 中被回收(即“幸存时间短”),说明 Survivor 区偏大,可适当增大 SurvivorRatio(如从 8→10),释放空间给 Eden,减少 GC 次数
- 若频繁发生 Survivor 区溢出(To Space Overflow),导致对象提前晋升到老年代(Premature Promotion),就说明 Survivor 太小,应减小 SurvivorRatio(如从 8→6 或 4)
- 可通过 GC 日志中的
Desired survivor size、new threshold及实际晋升量(promoted字段)辅助判断
配合其他参数一起看才有效
单独调 SurvivorRatio 很难见效,必须结合:
- -XX:MaxTenuringThreshold:控制对象晋升老年代前最多经历多少次 Minor GC。若 SurvivorRatio 调小后仍频繁晋升,可能需同步调高该值(但上限受对象年龄分布限制)
- -Xmn 或 -XX:NewRatio:先确定新生代总大小,再由 SurvivorRatio 分配内部结构。如果新生代本身太小,再怎么调比例也容易溢出
-
开启 GC 日志(如
-Xlog:gc*,gc+age=trace)观察每轮 GC 后各年龄对象分布,确认是否“卡在某个年龄集中晋升”
常见误区提醒
别踩这些坑:
- 认为 “SurvivorRatio=1” 就是 Eden 和两个 Survivor 一样大 —— 错!那是 Eden : S0 = 1 : 1,S1 还占一份,Eden 实际只占 1/3
- 在 G1 垃圾收集器下设置 SurvivorRatio —— 完全无效,G1 使用 -XX:G1MaxNewSizePercent 和 -XX:G1NewSizePercent 控制新生代范围,Survivor 动态伸缩
- 过度关注比例而忽略 GC 停顿时间和吞吐量 —— 比例只是手段,目标是降低晋升、减少 Full GC、控制 STW 时间

















