Tomcat中新增了一些功能后,原来正常的程序,在运行一段后,发生了一下错误:
Exception in thread "TP-Processor171" java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: PermGen space
PermGen内存溢出。根据网上查了一下资料,发现这是sun JDK分代管理的一个问题 --- 当然,程序使用上也有讲究,但是程序上只能尽量避开这个问题,说解决的方式更换JDK,换成BEA JRokit。
Permanent Generation space,是指内存的永久保存区域,用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。 如果你的WEB APP下都用了大量的第三方jar, 其大小 超过了jvm默认的大小(4M-- 这个值各个地方写的不一样,没有搞懂,要确切,到JDK提供的官方去查 )那么就会产生此错误信息了。
以下是网上的一些资料,
- http://www.totodotnet.net/2007/08/15/outofmemory:
PermGen-space异常的处理和分析/ 记录了分代内容管理的原理, - http://blog.csdn.net/xiaojianpitt/archive/2008/11/11/3276790.aspx
PermGen的一些说明,引用了Sun官方的一些解释 - http://www.cnblogs.com/huqingyu/archive/2008/09/18/1293454.html
列出了一些相关资料
---------------------------------------------------
问题已经查明,这个和程序编写有关系。
当初不知道谁写的代码,当hibernate发生错误的时候,就重构一个hibernate的factory,每发生一次错误,就重构一次。这样每次重构的时候,都会造成PermGen的增长。把这个问题解决了,PermGen Size也没有溢出过。
没有评论:
发表评论