解决OutOfMemoryError: PermGen Space问题的实战经验
需积分: 34 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。
2013-08-23 上传
2013-06-21 上传
103 浏览量
2020-08-26 上传
2018-04-23 上传
2015-06-08 上传
蚂蚁小帅哥
- 粉丝: 8
- 资源: 22
最新资源
- Fisher Iris Setosa数据的主成分分析及可视化- Matlab实现
- 深入理解JavaScript类与面向对象编程
- Argspect-0.0.1版本Python包发布与使用说明
- OpenNetAdmin v09.07.15 PHP项目源码下载
- 掌握Node.js: 构建高性能Web服务器与应用程序
- Matlab矢量绘图工具:polarG函数使用详解
- 实现Vue.js中PDF文件的签名显示功能
- 开源项目PSPSolver:资源约束调度问题求解器库
- 探索vwru系统:大众的虚拟现实招聘平台
- 深入理解cJSON:案例与源文件解析
- 多边形扩展算法在MATLAB中的应用与实现
- 用React类组件创建迷你待办事项列表指南
- Python库setuptools-58.5.3助力高效开发
- fmfiles工具:在MATLAB中查找丢失文件并列出错误
- 老枪二级域名系统PHP源码简易版发布
- 探索DOSGUI开源库:C/C++图形界面开发新篇章