Myeclipse与Tomcat环境下解决OutOfMemoryError: PermGen space的痛苦与收获

需积分: 10 2 下载量 100 浏览量 更新于2024-09-12 收藏 78KB DOCX 举报
在IT开发过程中,遇到"OutOfMemoryError: PermGen space"错误是常见的挑战,尤其是在使用Myeclipse 8.5和Tomcat 6.x的环境中。该错误通常表示程序在运行时无法分配足够的永久代(PermGen)内存,这对于存储类加载器的元数据和常量池等非常关键。解决这个问题的过程往往充满摸索,特别是对于初次遇到该问题的开发者来说。 首先,解决这类问题的关键在于理解PermGen空间的工作原理以及它与堆内存的区别。PermGen是Java虚拟机(JVM)的一部分,专门用于存放持久类、常量池和编译后的代码。如果应用程序频繁创建大量类或者使用了大量的静态字段,PermGen空间可能会迅速耗尽。 网络上充斥着各种解决 PermGen space溢出的方法,但并非所有建议都适用。作者提到尝试过文档《Linux和Windows修改Java虚拟机内存大小》中的方法,但未能解决问题。这表明直接调整JVM的内存参数可能不足以解决PermGen溢出,因为 PermGen的大小不是通过-Xmx或-Xms这样的堆内存选项来配置的。 作者使用JDK自带的jconsole工具对JVM内存进行监控,发现PermGen的最大值为64MB,这是默认设置。即使设置了更大的 PermSize 和 MaxPermSize 参数,但在Myeclipse中启动Tomcat时,这些配置并未生效。这是因为Myeclipse可能有自己的配置机制,或者这些设置没有正确地传递给JVM。 解决这个问题的步骤包括: 1. **理解配置**:确保对 PermGen 的特殊配置有所了解,如`XX:PermSize` 和 `XX:MaxPermSize`,它们分别设置初始和最大PermGen空间大小,而不是堆内存大小。 2. **检查启动参数**:在Myeclipse的catalina.bat文件中,需要确保设置正确。作者增加了`-XX:PermSize`和`-XX:MaxPermSize`的值,并且建议在`setJAVA_OPTS`变量后添加这些选项,以确保它们被JVM识别。 3. **排查Myeclipse设置**:Myeclipse可能有自己的内存管理配置,确认是否在IDE内部进行了额外的限制。有时,可能需要在Myeclipse的配置文件或首选项中找到并调整相应的设置。 4. **验证配置生效**:使用jconsole或其他JVM监控工具持续观察,确保新的配置已经被应用到正在运行的Tomcat实例中。 5. **性能分析**:如果以上步骤无效,可能需要进一步分析应用程序的内存使用情况,找出导致PermGen溢出的具体原因,例如是否存在大量的类创建或循环引用等问题。 总结来说,解决"OutOfMemoryError: PermGen space"需要深入理解JVM内存管理,特别是在PermGen空间的配置和监控上。通过细致的排查和调整,才能找到问题的根源并成功解决问题,尽管这个过程可能会显得痛苦,但最终找到解决方案后的成就感则是值得的。