直接原因是JVM堆内存不足,需在宝塔Java项目设置页的“JVM参数”框中正确填写如-Xms2g -Xmx2g -XX:MaxMetaspaceSize=512m等参数,并保存后重启项目;参数须空格分隔、无注释、无逗号,且必须重启才生效。

宝塔面板里 Java 项目报 java.lang.OutOfMemoryError: Java heap space,直接原因是 JVM 堆内存不够用,不是服务器物理内存不足——哪怕你有 16G 内存,-Xmx512m 也照样 OOM。
在宝塔「Java 项目」设置页填对 JVM 参数
进宝塔 → 「软件商店」→ 找到已安装的「Java 项目」→ 点击「设置」→ 拉到底部「JVM 参数」输入框。这里填的参数会原样拼接到 java -jar 命令前,但极易出错:
- 不能换行、不能含注释(比如
# -Xmx2g会直接报错) - 参数之间必须用空格分隔,
-Xmx2g-XX:MaxMetaspaceSize=256m少空格 = 无效 - 逗号、等号、引号全都不合法,
-Xmx2g, -XX:MaxMetaspaceSize=256m中的逗号会被当参数值传给 JVM,导致启动失败 - 推荐写法:
-Xms2g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC
为什么 -Xms 和 -Xmx 要设成一样?
堆大小动态伸缩看似灵活,实则代价很高:每次扩容要 stop-the-world,触发 Full GC;频繁收缩又造成内存碎片。生产环境必须锁死:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
-Xms2g -Xmx2g是底线,避免运行中反复调整堆边界 - 若物理内存 8G,
-Xmx2g是安全起点;超 4G 建议用 G1 回收器(-XX:+UseG1GC) - 别盲目堆大:-Xmx 超过物理内存 70%,可能触发系统 swap,反而更慢
验证参数是否真生效,别信宝塔内存图表
宝塔首页的「内存使用率」显示的是 RSS(常驻内存),包含 JVM 堆外内存(如直接内存、线程栈、CodeCache),不能反映堆实际占用。正确验证方式:
立即学习“Java免费学习笔记(深入)”;
- 执行
ps aux | grep java,找到你的项目进程,确认输出里完整出现你填的-Xmx、-XX:MaxMetaspaceSize等参数 - 若只看到
-Xmx2g却没MaxMetaspaceSize,说明配置未保存成功,或被项目内置的启动脚本覆盖(比如 jar 包里自带java -jar xxx.jar --spring.profiles.active=prod) - 进项目根目录,运行
java -XX:+PrintFlagsFinal -version | grep -E "MaxHeapSize|MaxMetaspaceSize",看数值是否被覆盖(需 JDK 8u191+)
最易被忽略的一点:改完参数后必须点「保存」再点「重启项目」——只点保存不重启,JVM 进程不会重载参数,等于白配。

















