调整新生代与老年代比例核心靠-xx:newratio(设老年代:新生代比值,默认2)和-xmn(直接指定新生代大小,优先级更高);新生代内由eden、s0、s1组成,默认survivorratio=8,需据对象生命周期和gc日志(minor gc间隔、promoted值、full gc频次)动态调优。

调整新生代与老年代比例,核心靠两个参数:-XX:NewRatio 控制两者大小关系,-Xmn 直接指定新生代绝对大小——后者会覆盖前者。比例不是越“大”越好,关键看对象生命周期和 GC 行为是否匹配。
用 -XX:NewRatio 设置相对比例
该参数定义 老年代 : 新生代 的比值,默认通常是 2(即老年代占堆的 2/3,新生代占 1/3)。计算方式简单:
- NewRatio=2 → 新生代 = 堆总大小 ÷ (2 + 1) = 约 33%
- NewRatio=1 → 新生代 = 堆总大小 ÷ (1 + 1) = 50%
- NewRatio=4 → 新生代 = 堆总大小 ÷ (4 + 1) = 20%
适合通用场景起步,比如 Web 服务短对象多,可尝试 NewRatio=1;缓存类长生命周期服务,NewRatio=3~4 更稳。
用 -Xmn 指定新生代固定大小
当堆较大(如 ≥8GB)或需要精确控制时,-Xmn 比 NewRatio 更可靠。例如:
- -Xmn2g 表示新生代强制为 2GB,剩余堆空间自动归老年代
- 它优先级高于 NewRatio,设了 -Xmn 后 NewRatio 就不生效
- 推荐值范围:通常为堆总大小的 1/4 到 1/3(如 8GB 堆配 2~2.6GB 新生代)
注意:-Xmn 值不能超过 -Xmx,也不宜过小(否则 Minor GC 频繁),更不能过大(挤压老年代引发 Full GC)。
别忘了新生代内部结构:-XX:SurvivorRatio
新生代不是铁板一块,它由 Eden、S0、S1 组成,默认比例 Eden:S0:S1 = 8:1:1(即 SurvivorRatio=8)。如果 Survivor 区太小,存活对象撑不过一次 GC 就被“挤”进老年代——这就是典型的“早夭晋升”。
- SurvivorRatio=6 → Eden 占新生代 6/8=75%,每个 Survivor 占 1/8≈12.5%
- 现象判断:GC 日志中 Promoted 数值异常高,且 S0/S1 使用率长期 >90%
- 建议:对象平均存活时间略长时,适当调小该值(如设为 6 或 4),给 Survivor 多留点缓冲空间
验证是否调对了:盯紧三类 GC 日志指标
加 -XX:+PrintGCDetails 启动后,重点观察:
- Minor GC 间隔:理想应 >10 秒;太短说明新生代偏小或 Survivor 不足
- Promoted 字段值:每次 Minor GC 后晋升到老年代的字节数;持续偏高说明对象“活不过一轮”
- Full GC 频次:正常应用应极少发生(如每天 ≤1 次);频繁触发往往意味着老年代吃紧或晋升失控











