-Xms和-Xmx分别设定JVM初始堆大小与最大堆大小,生产建议设为相同值(如-Xms2g -Xmx2g)以避免动态伸缩;-Xms不可大于-Xmx,否则启动失败,且-Xmx不应超过物理内存的75%。

Java 中通过虚拟机(JVM)参数调整堆内存大小,主要使用 -Xms 和 -Xmx 两个参数,分别设置堆的初始大小和最大大小。合理配置能避免频繁 GC 或 OOM,是性能调优的基础操作。
设置初始堆内存(-Xms)
该参数指定 JVM 启动时分配的堆内存大小,例如:
-Xms512m 表示初始堆为 512 MB;
-Xms2g 表示初始堆为 2 GB。
- 建议将 -Xms 设为与 -Xmx 相同值,避免运行时动态扩容带来的 GC 停顿
- 过小会导致频繁扩容和 Young GC;过大则可能延长 GC 时间或浪费内存
- 单位支持 k/K、m/M、g/G(如 1024k、512m、4g)
设置最大堆内存(-Xmx)
该参数限制 JVM 堆内存可扩展的上限,例如:
-Xmx2g 表示堆最多可用 2 GB;
-Xmx4096m 等价于 -Xmx4g。
- 必须 ≥ -Xms,否则 JVM 启动失败
- 不应超过物理内存的 75%,需为系统和其他进程预留空间
- 在容器(如 Docker)中,注意 JVM 默认不识别 cgroup 内存限制,建议配合 -XX:+UseContainerSupport(JDK 8u191+ / JDK 10+ 默认开启)
查看和验证配置是否生效
启动后可通过以下方式确认实际堆大小:
- 程序中调用
Runtime.getRuntime().totalMemory()(已分配)和maxMemory()(等效 -Xmx) - 使用
jstat -gc <pid></pid>查看 S0C、S1C、EC、OC、MC 等容量,其中 OC(Old Capacity)+ EC(Eden Capacity)+ S0C/S1C ≈ 总堆大小 - 添加 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 可在 GC 日志首行看到“Initial heap size”和“Max heap size”
常见组合与注意事项
典型安全配置示例:
-Xms2g -Xmx2g -XX:+UseG1GC
- 生产环境强烈推荐 -Xms = -Xmx,减少伸缩开销
- 避免使用过大的堆(如 > 8g),G1 或 ZGC 更适合大堆场景
- JDK 8 及以前默认使用 Parallel GC;JDK 9+ 默认 G1,JDK 17+ 推荐 ZGC(需显式启用)
- 若同时设置 -XX:MaxRAMPercentage(如 75.0),会覆盖 -Xmx,适用于容器化部署


















