java.lang.OutOfMemoryError: PermGen space (tomcat内存溢出)

本文详细介绍了如何解决在部署多个工程到一个Tomcat服务器时遇到的内存溢出问题,包括调整Java虚拟机参数、优化第三方jar文件使用、以及将重复的jar文件集中管理的方法。
同时将三个工程发布到一个tomcat下,启动出现内存溢出异常:
java.lang.OutOfMemoryError: PermGen space

如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,
这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下使用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)
那么就会产生此错误信息了。
解决方法: 手动设置MaxPermSize大小
修改TOMCAT_HOME/bin/catalina.sh (windows中修改catalina.bat)
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=256m

在eclipse中可以这样设置:
java>已安装的JRE>编辑>默认VM参数,在里面填上:
-Xms256m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=256m


建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
### 解决 `Handler processing failed; nested exception is java.lang.OutOfMemoryError: PermGen space` 问题 当出现 `java.lang.OutOfMemoryError: PermGen space` 错误时,表示JVM的永久代(Permanent Generation)内存区域已经溢出。PermGen 主要用于存储类的元数据(如类定义、方法信息等),在应用加载大量类(如使用大量第三方库或频繁重新部署Web应用)时,容易超出默认分配的内存大小,从而引发该错误[^2]。 #### 1. 增加 PermGen 内存大小 可以通过调整JVM启动参数来增加PermGen的可用内存。具体参数如下: ```bash -XX:PermSize=512M -XX:MaxPermSize=512M ``` 上述参数将PermGen的初始大小和最大大小都设置为512MB。如果服务器启动失败,说明系统内存不足,可以适当降低数值,例如设置为256M或384M[^4]。 #### 2. 避免频繁加载类 由于GC不会在运行期间清理PermGen中的类信息,频繁加载和卸载类(如在Web应用中频繁重新部署)会导致内存持续增长。可以通过以下方式优化: - **减少不必要的类加载**:避免使用大量第三方JAR文件,或合并部分库以减少类的数量。 - **使用类加载器缓存**:对于支持缓存的框架(如Spring),启用类加载缓存可以减少重复加载类的开销。 #### 3. 升级到JDK 8及以上版本 从JDK 8开始,PermGen被元空间(Metaspace)取代,类元数据被存储在本地内存中,不再受限于JVM堆内存的限制。这意味着即使加载大量类也不会轻易出现内存溢出问题。如果条件允许,建议升级到JDK 8或更高版本,以从根本上解决PermGen溢出问题[^3]。 #### 4. 优化JSP编译行为 在Web应用中,JSP页面在第一次访问时会被编译为Servlet类,这一过程会加载大量类并占用大量PermGen空间。可以通过以下方式优化: - **延迟编译JSP**:在应用启动时不预编译所有JSP页面,避免一次性加载过多类。 - **使用JSP缓存机制**:限制JSP编译缓存的大小,避免长时间运行导致类数量不断增长。 #### 5. 监控与分析内存使用情况 使用JVM监控工具(如JVisualVM、MAT或JConsole)定期检查PermGen的使用情况,识别内存泄漏或异常增长的类加载行为。通过分析堆转储(heap dump)文件,可以定位哪些类占用了大量PermGen空间,从而进行针对性优化。 --- ### 示例:JVM启动参数配置 ```bash JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=512M -Dfile.encoding=UTF-8" ``` 上述配置适用于大多数Web服务器(如Tomcat)的启动脚本,将其添加到环境变量或启动脚本中即可生效。 --- ### 注意事项 - 如果使用的是JDK 8及以上版本,应移除 `-XX:PermSize` 和 `-XX:MaxPermSize` 参数,改为使用 `-XX:MaxMetaspaceSize` 来限制元空间大小。 - 在调整内存参数时,需确保系统物理内存足够,避免因过度分配导致操作系统级内存不足。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值