关键在于让对象在新生代充分回收,减少进入老年代的频率,同时避免堆内存频繁伸缩或元空间失控:-xms与-xmx设为相同值(如-xms6g -xmx6g),新生代按1/3~1/2分配(-xx:newratio=2或-xmn3g~4g),survivor区调宽(-xx:survivorratio=6)、晋升阈值设6~8,元空间限幅(-xx:metaspacesize=256m -xx:maxmetaspacesize=512m)。

关键在于让对象在新生代充分回收,减少进入老年代的频率,同时避免堆内存频繁伸缩或元空间失控。这不是调单个参数的事,而是几个核心参数协同作用的结果。
堆大小要稳:-Xms 和 -Xmx 设成一样
初始堆和最大堆不一致,会导致 JVM 在运行中反复扩容缩容,每次调整都可能触发 Full GC 或卡顿。尤其在高并发场景下,这种抖动会放大成请求超时或线程堆积。
- 推荐设为相同值,比如 -Xms6g -Xmx6g
- 上限别超过物理内存的 70%,8G 服务器建议最大堆 ≤6g,留出系统和直接内存空间
- 如果应用内存波动极大(如定时批处理),可放宽为 -Xms4g -Xmx8g,但必须配合 GC 日志监控 YGC 频率和耗时
新生代要够用:-Xmn 或 -XX:NewRatio 合理分配
新生代太小,对象没来得及回收就“溢出”到老年代;太大又会让 Minor GC 耗时变长,影响响应延迟。目标是让大多数短生命周期对象在 Eden 区内完成生死轮回。
- 常见比例:堆的 1/3~1/2,例如 -Xmx8g 时设 -Xmn3g~4g
- 也可用 -XX:NewRatio=2(老年代:新生代 = 2:1),等价于新生代占堆 1/3
- Web 类应用(大量瞬时对象)倾向更大新生代;缓存类应用(长生命周期对象多)可适当降低比例
Survivor 区要能“扛住”:-XX:SurvivorRatio 和 -XX:MaxTenuringThreshold 配合调
Eden 区的对象经过一次 Minor GC 后进入 Survivor,再经历几次复制才晋升老年代。这两个参数决定了对象“熬”多久才走。
- -XX:SurvivorRatio=6 表示 Eden : S0 : S1 = 6:1:1,比默认的 8:1:1 更宽松,适合高并发写入场景
- -XX:MaxTenuringThreshold=6~8 适用于 Web 请求类应用(对象存活时间短);若对象普遍活过 10 次 GC,可设为 10~12
- 注意:阈值不是越高越好——过高的值会让 Survivor 区长期积压对象,反而增加复制开销
元空间不能放养:-XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 必须设限
JDK 8+ 的元空间用的是本地内存,不设上限等于把系统内存敞开了给类加载器用。Spring Boot、OSGi、动态代理多的应用极易触发 Full GC 甚至 OOM。
- -XX:MetaspaceSize=256m:作为初始容量和首次 Full GC 触发阈值,比默认 21MB 更稳妥
- -XX:MaxMetaspaceSize=512m:强限制上限,防止类加载失控;微服务可按 300~600m 区间选值
- 搭配 -XX:+PrintGCDetails -Xloggc:gc.log 查看 Metaspace 区 GC 是否频繁,若日志里出现 “Metadata GC Threshold” 就说明该调了











