-xms和-xmx必须设为相等,以避免动态扩容引发的内存抖动、频繁gc及stw延长;物理机建议设为可用内存的50%~70%,容器环境须基于memory limit并预留10%~20%缓冲,同时显式配置元空间、直接内存等非堆开销。

-Xms 和 -Xmx 应设为相等,这是最基础也最关键的设置。JVM 启动时若只分配较小初始堆(-Xms),后续业务增长触发扩容,会引发内存重新映射、GC 频率上升甚至 STW 延长。生产环境统一设为相同值,可消除动态伸缩带来的性能抖动。例如物理内存 16GB,可直接设为 -Xms8g -Xmx8g。
按物理或容器内存比例合理分配
堆大小不能脱离运行环境孤立设定:
- 通用服务器:-Xms / -Xmx 推荐设为物理内存的 50%~70%,兼顾应用需求与系统稳定性;
- 容器环境(Docker/K8s):必须基于容器 内存限制(memory limit) 计算,而非宿主机内存;
- JDK9+ 推荐使用
-XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0并启用-XX:+UseContainerSupport,让 JVM 自动感知容器资源边界。
新生代大小需主动控制
默认分代比例(-XX:NewRatio=2)往往不适用真实场景。高并发短生命周期对象多的服务,应增大新生代占比:
- 用
-Xmn直接指定新生代大小(如-Xmn3g),比依赖 NewRatio 更可控; - 新生代建议占堆的 1/3~1/2;过大可能挤压老年代,过小则 Minor GC 过于频繁;
- 配合
-XX:SurvivorRatio=10扩大 Eden 区,减少对象因 Survivor 空间不足而提前晋升。
预留非堆内存空间
堆只是 JVM 内存的一部分,元空间、线程栈、直接内存等同样占用系统资源:
- 元空间建议显式设置:
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m,避免启动期反复 Full GC; - 单线程栈大小(-Xss)默认 1MB,高并发服务可调至 256k~512k,防止 OOM due to unable to create new native thread;
- 总堆 + 元空间 + 线程栈 + 直接内存 ≈ 不应超过容器或系统内存的 80%。











