-Xms和-Xmx分别设定JVM初始堆大小与最大堆大小;生产建议设为相同值以避免动态伸缩,如-Xms2g -Xmx2g;-Xms不可大于-Xmx,否则启动失败。

-Xms 和 -Xmx 是 JVM 最常用的堆内存启动参数,分别控制 Java 应用启动时的初始堆大小和最大堆大小。
–Xms:设置 JVM 初始堆内存
该参数指定 JVM 启动时向操作系统申请的堆内存大小。JVM 不会一上来就分配全部堆空间,而是按需增长,但 -Xms 设得越高,初期 GC 压力越小,也减少了运行中扩容带来的开销。
- 若未显式设置,HotSpot 默认值通常为物理内存的 1/64(且有下限,如 12MB)
- 生产环境建议与 -Xmx 设为相同值,避免堆动态伸缩,提升稳定性
- 例如:
-Xms2g表示初始堆为 2GB
–Xmx:设置 JVM 最大堆内存
该参数限制 JVM 堆内存能使用的上限。当堆使用量达到此值且无法通过 GC 回收足够空间时,会抛出 OutOfMemoryError: Java heap space。
- 超过该值的内存申请将失败,JVM 不会突破此限制
- 建议根据应用实际内存占用、GC 表现和服务器可用内存综合设定,一般不超过物理内存的 75%
- 例如:
-Xmx4g表示堆最多可用 4GB
常见配置组合与注意事项
合理搭配 -Xms 和 -Xmx 能减少 GC 频率和停顿时间,尤其对响应敏感型服务很重要。
-
-Xms2g -Xmx2g:推荐用于生产环境,堆大小固定,避免扩容抖动 -
-Xms512m -Xmx4g:适用于内存波动大的场景(如批处理),但需关注 GC 日志确认是否频繁扩容 - 注意:-Xms 不能大于 -Xmx,否则 JVM 启动失败
- 单位支持 k/K、m/M、g/G(不区分大小写),如
-Xmx2048m与-Xmx2g等效
如何验证设置是否生效
启动后可通过 JMX、jstat 或应用内调用 Runtime.getRuntime().maxMemory() 等方式确认实际堆上限。
-
jstat -gc <pid>查看当前堆各区域容量与使用量 -
java -XX:+PrintFlagsFinal -version | grep HeapSize可查看默认或生效的堆参数 - JVM 参数优先级:命令行 > 配置文件 > 默认值,确保没有被其他脚本覆盖









