tomcat reload几次后OutOfMemoryError: PermGen space的解决方法

永久空间内存不足 java.lang.OutOfMemoryError: PermGen space,相比不少使用spring,hibernate等一堆jar包的人都遇到过这个问题,在tomcat reload一个Context多次后,tomcat就挂掉了。
http://www.wujianrong.com/archives/2006/12/javalangoutofmemoryerror_permg.html
PermGen space这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
我在做TMS的发布工具的时候,就遇到了问题,这个工具的目的是把一个相同的系统,在tomcat下自动的发布多份,但当卸载,重新发布多次后, tomcat就挂了,整个电脑如同死机一般。后来使用文章里的set JAVA_OPTS=-server -Xms800m -Xmx800m -XX:PermSize=64M-XX:MaxNewSize=256m-XX:MaxPermSize=128m -Djava.awt.headless=true 解决了问题,不过在2G的电脑上,我是把-XX:MaxPermSize=128m 调到了-XX:MaxPermSize=256m。另外我还尝试了把所有的lib都放到tomcat的lib下,一些lib就不能在本项目中再出现了。
现在看,还是spring,hibernate之类的产生的类导致PermGen space空间不足造成的这些问题。
http://www.javaeye.com/topic/80620?page=1 这个帖子里讨论了这个问题,有人做了些有益的分析可以看看。
我又继续在我的笔记本上做了测试T42,1G内存。tomcat版本6.0.14。
set JAVA_OPTS=-server -Xms256m -Xmx256m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true
这个配置反复发布是可以的,另外又一次测试了将项目下的jar包放到tomcat的lib下的对比。重新安装一个lib下为空的程序是10秒,否则是30秒。

posted on 2008-04-11 23:45 一农 阅读(16225) 评论(9)  编辑  收藏

评论

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法 2008-04-12 14:25 一农

连说带评写的不清晰,总结一下
1、修改tomcat的启动参数,类似如下的样子
set JAVA_OPTS=-server -Xms256m -Xmx256m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
2、将通用的lib文件放到tomcat的目录下  回复  更多评论   

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法 2008-04-12 15:11 千里冰封

不错,挺有用的  回复  更多评论   

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法 2008-04-12 20:57 stone2083

主要是spring和hibernate这些框架使用cglib动态生成代理类,动态加载类描述信息,导致如果perm区设置过小的情况下,会出现outofmemoryerror的情况。
但是也没有必要把perm区设置过大,可以在生产环境使用jstat命令观察perm区的情况,从来设定它的大小。  回复  更多评论   

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法 2008-04-12 23:03 一农

@stone2083
恩,我之前还不知道可以使用jstat进行观察,刚才找了下资料。多谢。  回复  更多评论   

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法 2008-04-12 23:04 saysoc

tomcat5.x本来就有问题,还是6好  回复  更多评论   

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法 2008-04-12 23:19 一农

@saysoc
我倒没再测试5,我现在都是在6下测的。  回复  更多评论   

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法 2008-04-14 14:23 lizhiyang

我觉得楼主解决此问题就是把MaxPermSize调大+将lib放入tomcat的lib下。原因是不是Spring、Hibernate照成的,不敢苟同。如果楼主认定是Spring、Hibernate照成的,最好能拿出一些有说服力的东西show一下。  回复  更多评论   

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法 2008-04-18 23:02 一农

@lizhiyang

我只是根据项目中多了spring,hibernate后,容易造成这个问题,以及spring,hibernate会产生很多类这个角度来猜测是其原因,倒确实没有正式确认过。  回复  更多评论   

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法 2008-07-01 17:30 ooyy

一直觉得reload 比较鸡肋, reload 整个context的时间跟我重启时间都差不多了,还要reload干嘛?
相比之下relaod class更有意义, 比如jdk的debug时,就能够做到。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

南京 java辅导班 约等于免费 详见yuqiaotech.com

导航

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

常用链接

留言簿(10)

随笔档案

文章分类

文章档案

相册

搜索

最新评论

阅读排行榜

评论排行榜