论坛首页 Java企业应用论坛

解决tomcat服务器出现“Out Of Memory”的问题!

浏览 14488 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (18) :: 隐藏帖 (3)
作者 正文
   发表时间:2011-08-25  
    如果在项目中用到了spring和hibernate并且数据量比较大的情况下,系统有时会突然出现“Out Of Memory”内存溢出的问题!可以试试下面的解决方案,如果机器配置比较好还可以适当加大点配置!

    在netbeans安装的tomcat下的bin目录的catalina.bat文件下找到这行:
echo Using CATALINA_BASE:   %CATALINA_BASE%
 
    在下面加入这行:
   
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m 
 
   发表时间:2011-08-26  
加内存大小不是解决问题的办法..
管好代码质量就能控制问题的发生了
0 请登录后投票
   发表时间:2011-08-26  
换服务器版的JDK还是IBM的JDK也行.
0 请登录后投票
   发表时间:2011-08-26  
- -# 这中问题有很多种可能性,是代码问题,还是真的内存瓶颈

或者是内存回收设置问题,使用spring和hibernate最好将老生代(是叫这名字吧,有点忘记了)设置大一点,不然看垃圾回收日志会发现经常有full回收,很慢的,尤其是sun的jdk和openjdk

0 请登录后投票
   发表时间:2011-08-26  
是不是闭包引起的
0 请登录后投票
   发表时间:2011-08-26  
JVM内存划分为很多区域,以Oracle(Sun) Hotspot为例来说,Perm,Heap,JVM stack等都有可能发生OOM,如果要解决OOM的问题,首先要定位到底哪个区域发生了问题,而且还要确定到底是内存溢出还是内存泄露,然后针对具体问题类型可以查看一些GC roots引用或者查看一些哪些对象生命周期过长等。
0 请登录后投票
   发表时间:2011-08-26  
daigong 写道
- -# 这中问题有很多种可能性,是代码问题,还是真的内存瓶颈

或者是内存回收设置问题,使用spring和hibernate最好将老生代(是叫这名字吧,有点忘记了)设置大一点,不然看垃圾回收日志会发现经常有full回收,很慢的,尤其是sun的jdk和openjdk


首先如果使用spring和hibernate你想说的应该是将Perm space(永久代)调大吧。
Full GC回收慢跟你设置的旧生代大小有很大关系,如果在64bit unix环境下,你将内存设置为10G,那么Full GC之间的停顿会让你感觉非常慢,时间可以达到秒级别,正常来说10秒都不是没有可能,用户就会感觉明显的停顿,当然这跟你选用的垃圾收集器也有关系。那么如果你的程序本身对实时性要求非常高,那么可以采用具有针对性的垃圾收集器来解决问题,比如选用CMS垃圾收集器,如果10G内存还频繁Full GC的话,那真就要查看一下代码,找出是否有占用内存非常大的对象,修改代码来解决问题才是关键,如果不是频繁GC的话,可以考虑每天半夜强制一下GC,或者重启应用都可以。那么话说回来,如果旧生代内存占用比较小,比如几十M或者几百M,停顿时间还是非常小的,基本上消耗时间都是MS级别的。
0 请登录后投票
   发表时间:2011-08-26  
这个是需要靠硬件保证的,还得找根本的原因。
因为hibernate使用了一级缓存,如果并发访问量很大时,同时缓存到内存中的数据会很多,这是导致OOM的原因。
一般操作是对一级缓存进行及时的清空
Session session =SessionFactory.openSession();
Transaction tx =session.beginTransaction();
Itertaor users=session.find("from User u where u.age>0").itertaor();//HSL语句就不做解释了
while(user.hasNext()){
User user =(User)users.next();
user.setAge(user.getAge()+1);
//将本批插入的对象立即写入数据库并释放内存
session.flush();
session.clear();
}
tx.commit();
session.close();

可以参考http://nauu.iteye.com/blog/197212
0 请登录后投票
   发表时间:2011-08-26  
和hibernate无关 over
0 请登录后投票
   发表时间:2011-08-26  
根据LZ提供的信息,貌似是Perm的OOM,可能是CGLIB引起的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics