一农工作室

南京雨桥科技 承接外包 JavaEE GIS GPRS GPS http://www.ynstudio.com
随笔 - 11, 文章 - 3, 评论 - 114, 引用 - 0
数据加载中……

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 一农 阅读(2024) 评论(9)  编辑  收藏

评论

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法  回复  更多评论   

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

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法  回复  更多评论   

不错,挺有用的
2008-04-12 15:11 | 千里冰封

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法  回复  更多评论   

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

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法  回复  更多评论   

@stone2083
恩,我之前还不知道可以使用jstat进行观察,刚才找了下资料。多谢。
2008-04-12 23:03 | 一农

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法  回复  更多评论   

tomcat5.x本来就有问题,还是6好
2008-04-12 23:04 | saysoc

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法  回复  更多评论   

@saysoc
我倒没再测试5,我现在都是在6下测的。
2008-04-12 23:19 | 一农

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法  回复  更多评论   

我觉得楼主解决此问题就是把MaxPermSize调大+将lib放入tomcat的lib下。原因是不是Spring、Hibernate照成的,不敢苟同。如果楼主认定是Spring、Hibernate照成的,最好能拿出一些有说服力的东西show一下。
2008-04-14 14:23 | lizhiyang

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法  回复  更多评论   

@lizhiyang

我只是根据项目中多了spring,hibernate后,容易造成这个问题,以及spring,hibernate会产生很多类这个角度来猜测是其原因,倒确实没有正式确认过。
2008-04-18 23:02 | 一农

# re: tomcat reload几次后OutOfMemoryError: PermGen space的解决方法  回复  更多评论   

一直觉得reload 比较鸡肋, reload 整个context的时间跟我重启时间都差不多了,还要reload干嘛?
相比之下relaod class更有意义, 比如jdk的debug时,就能够做到。
2008-07-01 17:30 | ooyy

标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
 
相关链接:
网站导航: