-XX:SurvivorRatio 如何设置新生代比例
通过 -xx:survivorratio 参数可以调整 eden 区与单个 survivor 区的容量比例,从而决定新生代的内存分配结构。该参数指定 eden 区大小是单个 survivor 区的倍数,默认值为 8,即 eden : s0 : s1 = 8:1:1。修改此参数会直接改变对象在新生代中的初始分配位置及 minor gc 后的存活对象去向。

public class SurvivorRatioDemo {
public static void main(String[] args) {
// 设置 JVM 参数示例:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:SurvivorRatio=4
// 此时 Eden:S0:S1 = 4:1:1
byte[] allocation1, allocation2;
allocation1 = new byte[1024 * 1024]; // 1MB
allocation2 = new byte[1024 * 1024]; // 1MB
allocation3 = new byte[1024 * 1024]; // 1MB
allocation4 = new byte[4 * 1024 * 1024]; // 4MB
}
}
运行上述代码并配合 -XX:SurvivorRatio=4 时,JVM 会根据堆总大小计算各区域容量。Eden 区占比较大,前三个 1MB 对象通常分配在 Eden 区。当触发 Minor GC 时,存活对象会被复制到 Survivor 区。若 Survivor 区空间不足(例如大量短命对象或 SurvivorRatio 设置过小),则会发生老年代分配担保失败或直接晋升到老年代。
SurvivorRatio 对 Minor GC 频率的影响
减小 -XX:SurvivorRatio 的值会使 Eden 区相对变小,导致对象更快填满 Eden 区,从而增加 Minor GC 的频率。相反,增大该值可以延长 Eden 区的寿命,减少垃圾回收次数,但可能增加 Survivor 区的压力。

-XX:SurvivorRatio
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











