0 0

急求解答java.lang.OutOfMemoryError: PermGen space5

公司的网站经常会死掉,每次重启tomcat就会好用catalina错误日志如下:

2013-4-19 3:27:41 org.apache.catalina.core.StandardContext listenerStart
严重: Error configuring application listener of class com.sun.faces.config.ConfigureListener
java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1847)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:890)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1354)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at com.sun.faces.config.ConfigureListener.<clinit>(ConfigureListener.java:209)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3787)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3099)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:404)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1309)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1601)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)
at java.lang.Thread.run(Thread.java:619)

catalina.out错误日志:
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor3" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor11" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor5" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor12" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor2" Exception in thread "TP-Processor8" java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor9" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor16" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor15" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor14" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor13" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor20" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor19" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor18" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor17" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor24" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor23" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor22" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor21" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor28" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor27" java.lang.OutOfMemoryError: PermGen space
Exception in thread "TP-Processor26" java.lang.OutOfMemoryError: PermGen space
2013年4月19日 09:33

9个答案 按时间排序 按投票排序

1 0

先解释下什么是PermGen space
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误

注意红色部分,如果加载的class太多就可能产生这个问题。
我也曾经遇到过这种问题,并且在博客中写过:
异常:java.lang.OutOfMemoryError: PermGen space
http://yunzhu.iteye.com/blog/1035741

我遇到的这个问题,引起的原因是自定义ClassLoader重复加载了很多次相同的jar,所以只要避免重复加载同样的jar就可以解决问题了。

所以可能的原因有:
加载了太多的class
加载了太多的jar
重复加载了太多的jar

具体的解决方法:
1. 手动设置MaxPermSize的大小
修改 TOMCAT_HOME/bin/catalina.bat(Linux上为catalina.sh)文件,
在echo "using CATALINA_BASE:$CATALINA_BASE"上面加入这一行内容:

set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128m -XX:MaxPermSize=512m


catalina.sh修改如下:
JAVA_OPTS="$JAVA_OPTS" -server -XX:PermSize=128m -XX:MaxSize=512m


2.修改 TOMCAT_HOME/bin/catalina.bat文件的内容:在 %_EXECJAVA% %JAVA_OPTS% 后面添加:
-Xms=256m -Xmx512m 
注意哦,前后有空格的

例如:%_EXECJAVA% %JAVA_OPTS% -Xms=256m -Xmx512m(空格),后面的内容不变

3. 可以考虑将相同的第三方jar文件拷贝到tomcat/shared/lib 目录下,这样可以减少jar文件重复占用内存的。

2013年4月19日 09:46
0 0

具体的解决方法:
1. 手动设置MaxPermSize的大小
修改 TOMCAT_HOME/bin/catalina.bat(Linux上为catalina.sh)文件,
在echo "using CATALINA_BASE:$CATALINA_BASE"上面加入这一行内容:


set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128m -XX:MaxPermSize=512m



这个方式已经试过,是可以的。刚解决了我的问题。

2014年5月24日 12:58
0 0

所有这些问题都应该是程序本身的问题,调整参数只是一个缓兵之策!
建议做一下压力测试,然后使用内存查看工具分析一下到底哪些class加载得太多了。在windos平台上我用jprofile比较多,图形化的界面,对分析问题很有帮助;

2013年4月28日 17:35
0 0

前段时间我也出现了这样问题,最后检查是因为在server.xml中用了<Context path="" docBase="myproject" debug="0" reloadable="false" />指定了路径,实际上把myproject内容放到ROOT下面是一样作用...

可能跟tomcat版本有关系..不知道你是不是也是因为这样原因..

2013年4月19日 17:25
0 0

我在用myeclipse的时候,也出现了这个问题
修改如下:
1. window-->Preferences...-->MyEclipse-->Application Servers-->Tomcat,
2. 选中你安装的tomcat版本,选中下面的JDK,在右边的
   Optional Java VM arguments 文本框中输入:
   -Xmx256M -Xms256M -XX:MaxPermSize=256m

这些值可以适当调整

2013年4月19日 14:25
0 0

加载项太多,perm size小了

2013年4月19日 12:57
0 0

即hotspot的永久代 内存不足

1、调大内存 看看是不是还有问题
1、修改PermSize 看看还报错不 如果不报错说明perm size太小
如果是java 可以写个脚本 使用如我自己的
export JAVA_OPTS="$JAVA_OPTS -Xms50m -Xmx400m -XX:PermSize=128M -XX:MaxPermSize=200M"
/usr/program/tomcat-ssonline/bin/startup.sh

http://blog.csdn.net/zenwong/article/details/2409775

2、如果还是有问题
使用 jmap -permstat 获取永久代 来分析哪些数据造成的影响
http://stackoverflow.com/questions/2051734/why-is-permgen-space-growing

2013年4月19日 11:13
0 0

引用
经常会死掉,每次重启tomcat就会好用

引用
严重: Error configuring application listener of class com.sun.faces.config.ConfigureListener


不知道这个“经常”是多久,看上去是JSF相关的地方有内存泄漏。

不大靠谱的办法有

1.tomcat的版本
2.JSF的实现的版本。
3.JVM的版本。

检查上述东西的版本,看看官方是否有bug报告和补丁。

最后,检查程序的代码,看看有没有内存泄漏。用些工具监视运行时内存会好些。

最后的最后,定时重启Tomcat吧!

最后的最后的最后,定时重启服务器吧!

2013年4月19日 10:46
0 0

方法区或者常量池溢出了,用jdk内部的C:\Program Files\Java\jdk1.6.0_11\bin\jconsole.exe,查看一下你的jdk运行时状态,把  -XX:PermSize,-XXMaxPermSize 调大一些。

2013年4月19日 09:47

相关推荐

Global site tag (gtag.js) - Google Analytics