解决OutOfMemoryError: PermGen Space问题的实战经验

需积分: 34 13 下载量 143 浏览量 更新于2024-09-09 收藏 80KB DOCX 举报
"这篇文章主要介绍了如何解决在使用Tomcat时遇到的`OutOfMemoryError: PermGen space`问题,作者在尝试各种解决方案后,最终通过调整JVM参数并使用JConsole监控内存来找到问题所在。" 文章的核心知识点如下: 1. **`OutOfMemoryError: PermGen space`**:这是Java应用程序在运行时由于permgen区域(永久代)内存不足导致的错误。PermGen用于存储类的元数据,如类加载器、方法和字段的信息。当应用加载大量类或频繁部署新版本时,可能会耗尽这个区域的内存。 2. **Tomcat与内存配置**:Tomcat作为Java应用服务器,其内存配置对处理应用的内存需求至关重要。作者在MyEclipse 8.5中使用Tomcat 6.x时遇到了这个问题。 3. **JVM内存模型**:Java虚拟机(JVM)有多个内存区域,包括堆(Heap)、新生代(Young Generation)、老年代(Tenured Generation)以及 PermGen。每个区域都有自己的分配策略和回收机制。 4. **解决问题的过程**:作者首先尝试了网络上的一些通用解决方案,如增大JVM的堆大小,但问题依然存在。接着,他使用了JConsole,一个JDK自带的性能监视工具,来查看实际生效的内存配置。 5. **JConsole使用**:JConsole可以实时监控JVM的状态,包括内存使用情况。通过JConsole,作者发现 PermGen 区域的最大值只有64MB,远低于他设置的值,这表明他的内存配置没有生效。 6. **调整`JAVA_OPTS`**:在Tomcat的启动脚本(如`catalina.bat`)中,`JAVA_OPTS`环境变量用于设置JVM参数。作者在`rem ----- ExecuteTheRequestedCommand ---`之后添加了以下命令: ``` set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=512m ``` 这些参数分别设置了初始堆大小、最大堆大小、PermGen的初始大小、新生代的最大大小和PermGen的最大大小。 7. **注意事项**:配置JVM参数时,确保参数正确地添加到`JAVA_OPTS`中,且位置得当。有时,不正确的配置可能导致参数被覆盖或无效。 8. **内存优化**:解决`OutOfMemoryError: PermGen space`的问题通常涉及到调整JVM内存分配,尤其是增大PermGen的大小。此外,优化代码以减少类的加载和使用可减少对PermGen的需求。 9. **避免类加载过多**:频繁的重新部署或大量的动态类加载可能导致PermGen溢出,因此,合理设计应用的类加载机制和减少不必要的类加载也是防止这类错误的关键。 10. **版本更新**:随着Java的版本升级,`PermGen`在Java 8中已被移除,替换为更大的Metaspace。对于较新的Java版本,遇到类似问题时,需要调整Metaspace的大小而不是PermGen。