java.lang.OutOfMemoryError: PermGen space
最近公司的网站在manager下重启几次后,老是出现java.lang.OutOfMemoryError: PermGen space,这个错误,但是在网上查了很多都说是需要增大内存.说增大内存就能解决完事了,
但是这个不是太让人信服,我怕我增大之后,还会出现,到时候丢人就丢大了!于是我自己在本机上测试,并且通过,jconsole监控我的jvm,终于找到了点有用的东西!
这个是写的错误报告:
内 存中分 堆内存 和 非堆内存 ,堆内存只要存储的是变量 数据之内的东西, java 的GC会在内存还剩10%左右的时候进行清理, 但是当内存中加 载的数据量过于庞大,如一次从数据库取出过多数据 这个地方会报 OutOfMemoryError: Heap space 错误
在 非堆内存(permanent)中,主要存储类的定义等不怎么变的数据。反复部署应用程序很多遍后,tomcat往往难以处理复杂的类依赖关系, 对 permanent区域的内存回收更是很困难的,最后导致越用越多,几遍之后这个区域就不够用了,而这个区域又是不能增长,并且不会GC... 之后便 会报java.lang.OutOfMemoryError: PermGen space
省了些东西(图片你们可以在 java的bin目录下使用jconcole 检测,一样的)
我认为原因是:反复部署应用程序很多遍后,tomcat往往难以处理复杂的类依赖关系, 对permanent区域的内存回收更是很困难的,才会报这个错的,
我希望每次的部署完成,能进行tomcat重启,或者加大PermGen space 这块内存,
解决方法: 手动设置MaxPermSize大小
a.如果tomcat是以bat方式启动的,则如下设置:
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
b.如果tomcat是注册成了windows服务,以services方式启动的,则需要修改注册表中的相应键值。
打开注册表,找到目录HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation
\Procrun 2.0\htfty\Parameters\Java,其中目录地址中红色标注的(如htfty)需要根据不同情况作修改,为
tomcat服务注册成 windows服务的名称。 可以看到JvmMs和JvmMx项,其中JvmMs设置最小的内存使用参数,JvmMx设置最大的
内存使用参数。设置好JvmMs和JvmMx项的值,重 启tomcat服务器即可生效。
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。