堆内存调优需系统性分配各区域大小:-xms与-xmx必须相等以避免动态扩容引发额外gc;总堆不超过物理内存70%;年轻代建议-xmn显式设置,web类应用占40%–50%,缓存类可降至30%;survivorratio设为6更适高并发;元空间需固定metaspacesize与maxmetaspacesize(如256m)防止full gc。

堆内存调优不是简单地把 -Xmx 调大,而是根据应用对象生命周期、GC 行为和硬件资源,系统性地分配各区域大小,减少 Full GC、缩短 STW 时间、避免 OOM。
明确堆大小:-Xms 与 -Xmx 必须相等
运行中动态扩容堆会触发额外 GC 和内存拷贝,带来不可控停顿。建议:
- -Xms 和 -Xmx 设为相同值(如 -Xms4g -Xmx4g);
- 总堆大小不超过物理内存的 70%(例如 16G 机器设为 10–12G),为 OS、元空间、直接内存留出余量;
- 低于 4G 堆时可不设 -Xmn,让 JVM 自动分配;超过 4G 后建议显式指定年轻代大小,增强可控性。
合理划分年轻代:-Xmn 或 -XX:NewRatio
年轻代是 GC 最频繁的区域,其大小直接影响对象晋升频率和老年代压力:
- Web 类短生命周期应用(如 Spring Boot 接口服务):年轻代占堆 40%–50%,例 -Xmn2g(堆 4g)或 -XX:NewRatio=1;
- 缓存/长周期对象多的应用(如本地计算型服务):年轻代可降至 30%,例 -XX:NewRatio=2(默认)或 -XX:NewRatio=3;
- 若用 -Xmn,则无需再配 -XX:NewRatio,二者互斥;-Xmn 更直观,推荐新项目优先使用。
优化年轻代内部结构:Survivor 区与晋升阈值
Eden 区负责新对象分配,Survivor 区决定对象能否“活下来”并延迟进入老年代:
- -XX:SurvivorRatio=6(Eden:S0:S1 = 6:1:1)比默认 8 更适合高并发场景,增大 Survivor 容量,降低因空间不足导致的提前晋升;
- -XX:MaxTenuringThreshold=6 可配合 SurvivorRatio 使用——短生命周期对象多时,设低些(6–8),避免“熬”到 15 次才进老年代;
- 若发现大量对象在 YGC 后直接进入老年代(日志中 “Promotion failed” 或 “to-space overflow”),优先检查 Survivor 是否太小,而非盲目调大堆。
元空间不能忽略:-XX:MetaspaceSize 与 -XX:MaxMetaspaceSize
类加载行为(尤其 Spring CGLIB 动态代理、热部署、插件化架构)会让元空间快速增长,且默认无上限:
- 必须设置 -XX:MaxMetaspaceSize(如 256m 或 512m),防止吃光系统内存;
- -XX:MetaspaceSize 建议设为与 Max 相同(如 -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m),避免首次达到阈值后触发不必要的 Full GC;
- 若应用频繁加载/卸载类(如 OSGi、模块热更),可适当提高上限,并配合 -XX:MinMetaspaceFreeRatio 控制回收敏感度。











