一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

MyEclipse内存溢出(OOM)的解决方案:调整JVM启动参数与内存优化

时间:2026-06-30 11:44:52 编辑:袖梨 来源:一聚教程网

MyEclipse启动时报java.lang.OutOfMemoryError: PermGen space,是JDK 7及更早版本因永久代空间不足所致,需在Preferences→MyEclipse→Servers→Tomcat→JDK的VM参数中设置-XX:PermSize=512m -XX:MaxPermSize=1024m;JDK 8+则应改用-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m,且必须配置在MyEclipse界面而非eclipse.ini或catalina.bat中。

MyEclipse启动时就报 java.lang.OutOfMemoryError: PermGen space

这是 JDK 7 及更早版本的典型现象,本质是方法区(永久代)被类加载器反复加载的 class 填满,尤其在频繁热部署、多项目共存或使用大量反射框架(如 Spring)时极易触发。

关键不是堆内存不够,而是 -XX:MaxPermSize 设置太小。MyEclipse 自身插件多、Tomcat 加载多个 WebApp,256m 往往撑不住。

  • 必须改 Window → Preferences → MyEclipse → Servers → Tomcat x.x → JDK → Optional Java VM arguments,填入:-XX:PermSize=512m -XX:MaxPermSize=1024m
  • 如果用的是 JDK 8+,这个错误不会出现——PermGen 已被 Metaspace 替代,此时要换参数:-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
  • 别只改 eclipse.inicatalina.bat:IDE 启动 Tomcat 时,优先读取的是 MyEclipse 界面里配置的 JVM 参数,其他地方改了也无效

运行项目时突然抛 java.lang.OutOfMemoryError: Java heap space

堆内存耗尽,说明对象分配太多、GC 清不掉,或者初始堆太小导致频繁扩容再 GC,最终失败。

常见诱因是:SSM 项目里没分页查数据库、List 不断 add 对象没清空、缓存未设上限、上传大文件未流式处理。

  • -Xms-Xmx 必须设为相同值,比如 -Xms1024m -Xmx1024m,避免运行中反复调整堆大小带来的开销和碎片
  • 物理内存 8GB 的机器,-Xmx 别超过 2048m;超过会挤占系统和其他进程资源,反而引发卡顿甚至崩溃
  • 若用了 -Xmn(新生代大小),建议设为 -Xmx 的 1/3~1/4,比如 -Xmx2048m 对应 -Xmn512m,太小会导致 Minor GC 频繁,太大则老年代空间不足

MyEclipse 自身卡死、编辑器响应慢、打开项目就崩溃

这不是项目的问题,是 MyEclipse 运行环境(即它自己的 JVM)内存不足。它和你跑的 Tomcat 是两个独立 JVM 进程。

症状包括:打开 .java 文件卡顿数秒、保存时报错、控制台日志刷屏但无响应、新建项目失败。

  • 修改 MyEclipse 安装目录/eclipse.ini,重点调 -vmargs 下的参数:-Xms1024m -Xmx2048m -XX:MaxMetaspaceSize=512m
  • -XX:+UseG1GC 可加可不加;G1 在大堆(>4GB)下优势明显,但 MyEclipse 自身堆一般不到 2GB,CMS 或默认 GC 足够
  • 删掉 ini 文件里重复的 -Xmx 行(常见于手动改过多次的人),JVM 只认最后一个生效,重复反而容易写错单位(比如漏写 m

改完参数还是 OOM?先确认到底是谁的内存爆了

很多人调了半天,发现根本没生效——因为压根没搞清当前 OOM 发生在哪一个 JVM 上。

MyEclipse 环境里至少存在三个独立 JVM:MyEclipse 主进程内嵌 Tomcat 进程你用 maven build 时起的独立 JVM。每个都要单独配参数。

  • 看错误堆栈最顶部的线程名:main 线程出错,一般是 Tomcat;Worker-xx 或没线程名但含 org.eclipse 包路径,就是 MyEclipse 自身
  • jps -l 命令列出所有 Java 进程 PID,再用 jstat -gc <pid> 查对应堆使用率,比看日志更准
  • 如果改了 MyEclipse 的 eclipse.ini 没反应,检查是否用了 -vm 指向了另一个 JDK,此时 eclipse.ini-vmargs 可能被忽略
真正麻烦的从来不是参数数字怎么填,而是你得先分清:OOM 是发生在 IDE 进程、Web 容器进程,还是构建工具进程里。参数填再大,喂错了嘴,照样溢出。

热门栏目