正确入口是Run → Run Configurations… → Java Application → Arguments标签页 → VM arguments输入框;-XX:PermSize等已废弃,应使用-XX:MetaspaceSize等新参数;改后无效主因是未保存配置、选错运行项或JDK版本不匹配。

在Eclipse中添加VM arguments的正确入口
不是改 eclipse.ini,也不是全局设置 JRE 的 Default VM Arguments —— 那些只影响 Eclipse 自身或所有 Java 运行时环境。你要配的是「单个 Java 应用程序」启动时的 JVM 参数,必须进运行配置(Run Configuration)里设。
操作路径:Run → Run Configurations… → Java Application → 新建或选中已有配置 → Arguments 标签页 → VM arguments 输入框。
常见误操作:在 Program arguments 里写 -Xmx2g,结果报错或无效——因为那是传给 main(String[] args) 的,JVM 根本不认。
哪些 VM arguments 现在还安全可用
Java 8 之后永久代(PermGen)已被元空间(Metaspace)取代,-XX:PermSize 和 -XX:MaxPermSize 已被完全移除,再用会触发 Unrecognized VM option 错误。
当前推荐用的稳定参数(OpenJDK 17/21 兼容):
-
-Xms512m -Xmx2g:堆内存初始与最大值,建议设为相等避免 GC 时动态伸缩 -
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m:防止热部署时类元数据堆积溢出 -
-Dfile.encoding=UTF-8:显式指定编码,避免 Windows 下默认 GBK 导致读文件乱码 -
-Dsun.net.client.defaultConnectTimeout=5000:控制 HTTP 连接超时,调试网络调用时有用
慎用或禁用:
-
-XX:ReservedCodeCacheSize:现代 OpenJDK(17+)已自动管理,手动设反而可能限制 JIT 编译 -
-XX:+UseParallelGC等垃圾收集器开关:除非明确压测对比,否则让 JVM 自适应更稳妥
为什么改了没生效?三个高频原因
你填了 -Xmx4g 却还是抛 OutOfMemoryError: Java heap space,大概率是以下其一:
- 运行配置没保存:点完
Apply后忘了点Run,或者点了Close没保存,下次启动仍用旧配置 - 选错了配置项:项目里有多个
Run Configuration(比如MyApp (1)、MyApp (2)),你改的是 A,实际运行的是 B - JDK 版本不匹配:用 JDK 21 启动,却写了
-XX:+UseG1GC -XX:MaxGCPauseMillis=200这类 G1 参数,而你的项目实际绑定的是 JDK 8 JRE(Eclipse 中每个运行配置可指定不同 JRE)
验证是否生效最直接的办法:在代码里加一行 System.out.println("Max memory: " + Runtime.getRuntime().maxMemory() / 1024 / 1024 + " MB");,看输出是否接近你设的 -Xmx 值。
Tomcat 集成场景下 VM arguments 的特殊位置
如果你在 Eclipse 里用内置 Tomcat 跑 Web 应用,Run Configurations → Java Application 里的 VM arguments 是无效的——那只是启动一个普通 Java 类,不是 Tomcat 容器。
真正起作用的位置是:Server 视图 → 双击 Tomcat 服务器 → Open launch configuration → Arguments 标签页 → VM arguments。
这里填的参数会传给 Tomcat 启动进程(即 catalina.sh/.bat 最终调用的 java 命令),所以:
- Web 应用的堆内存、Metaspace、系统属性都得在这里设
- 如果同时启用了多个 Tomcat 实例,每个实例的配置相互独立,不会冲突
- 热部署频繁时,
-XX:MaxMetaspaceSize必须设,否则几轮 redeploy 后必报OutOfMemoryError: Metaspace
别漏掉这个细节:Eclipse 内置 Tomcat 默认使用 workspace metadata 目录下的临时 catalina.base,它和你手动安装的 Tomcat 完全无关,参数修改只影响当前 workspace。


















