收藏到: Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网 QQ书签 更多 Bookmark and Share

2009年4月27日星期一

Tomcat遇到了“java.lang.OutOfMemoryError: PermGen space”

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,是指内存的永久保存区域,用于存放ClassMeta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放InstanceHeap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APPLOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。 如果你的WEB APP下都用了大量的第三方jar, 其大小 超过了jvm默认的大小(4M-- 这个值各个地方写的不一样,没有搞懂,要确切,到JDK提供的官方去查)那么就会产生此错误信息了。 


以下是网上的一些资料,
---------------------------------------------------
问题已经查明,这个和程序编写有关系。

当初不知道谁写的代码,当hibernate发生错误的时候,就重构一个hibernate的factory,每发生一次错误,就重构一次。这样每次重构的时候,都会造成PermGen的增长。把这个问题解决了,PermGen Size也没有溢出过。





没有评论:

发表评论