1. 遇到问题
开发环境启动 tomcat ,在没有访问的时候,日志一直刷新不断,直到抛出异常:Caused by: java.lang.OutOfMemoryError: PermGen space.
2. 原因猜测
PermGen不够用。
3. 尝试修复
在eclipse.ini配置文件中加上以下两行
-XX:PermSize=128M
-XX:MaxPermSize=128M
加上上2行后,我的eclipse.ini文件如下所示:
-showsplash
org.eclipse.platform
–launcher.XXMaxPermSize 512m
-vmargs
-Xms256m
-Xmx512m
-XX:PermSize=128M
-XX:MaxPermSize=128M
这里的内存大小根据自己的物理内存情况来决定吧。
从网上的资料看PermSize大一点肯定更好,而且最好是设置PermSize和MaxPermSize一样大。理由如下:
PermSize 和MaxPermSize如果设置为相同还可以在一定程度上提高性能,因为,PermSize在不断的变化中会需要转移其中的数据。如果固定了以后,则可以减少每次扩大PermSize带来的性能损失。
PermGen space简介
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。
说说为什么会内存益出:
(1)这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同。
(2) GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多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:
JAVA_OPTS=”-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以减少jar 文档重复占用内存
|
重启tomcat,没有修复问题。
4. 继续排查
为什么没有访问的情况下会持续刷日志?
修改tomcat配置文件server.xml(就是设置Server port和connector port的那个文件),找到下面内容:
reloadable= “true” source= “org.eclipse.jst.jee.server:testxx” />
前方高能 >>> 修改蓝色部分reloadable=“false”
重启问题解决
5. 分析原因
设置reloadable=”true”后,tomcat会持续监测Javabean,一旦发现Javabean源文件改动,服务器立即重启。
继续求助baidu
1. 可以在test/META-INF目录下面放置一个context.xml文件,内容如下:
2. 也可以在conf/Catalina/localhost目录下放置一个test.xml文件,内容如下:
3. 如果想让localhost下的所有web应用都自动reload,那么可以在conf/Catalina/localhost目录下放置一个context.xml.default文件,内容如下:
4. 如果希望tomcat下的所有web应用都自动reload,还有一种方法。方法如下:
随便修改一下test/WEB-INF/web.xml文件,比如加个空行,然后保存,这样tomcat会自动监测到web.xml被修改了,然后就重新加载test应用。这个自动监测的配置属于tomcat的默认配置,配置信息如下:
conf/context.xml文件中
WEB-INF/web.xml
这个文件中的配置适用于所有的web应用,不过这种方法有些局限性,就是WatchedResource 中只能指定一个具体的文件,不支持WEB-INF/*等模式匹配,所以无法做到监测整个web应用。
5. 还可以修改server.xml文件,在下面配置信息:
不过这种方法不建议使用,因为修改server.xml文件需要重启tomcat,而且不便于管理,因为 server.xml里面的配置信息比较重要,所以最好把web应用自身的配置信息放在单独的文件中管理比 较好。
|
6. 总结
网上也看到一些帖子,开启了reloadable=true导致permgen溢出。感觉tomcat这个动态加载功能还不是很靠谱啊。之前也听说有线上环境tomcat,上传class文件时不重启tomcat,反复几次后导致内存溢出。估计就是permgen中的实例没有回收导致。暂且到这,有时间再深入看下tomcat动态加载的机制。
世界杯时间~


