精华帖 (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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-08-26
加内存大小不是解决问题的办法..
管好代码质量就能控制问题的发生了 |
|
返回顶楼 | |
发表时间:2011-08-26
换服务器版的JDK还是IBM的JDK也行.
|
|
返回顶楼 | |
发表时间:2011-08-26
- -# 这中问题有很多种可能性,是代码问题,还是真的内存瓶颈
或者是内存回收设置问题,使用spring和hibernate最好将老生代(是叫这名字吧,有点忘记了)设置大一点,不然看垃圾回收日志会发现经常有full回收,很慢的,尤其是sun的jdk和openjdk |
|
返回顶楼 | |
发表时间:2011-08-26
是不是闭包引起的
|
|
返回顶楼 | |
发表时间:2011-08-26
JVM内存划分为很多区域,以Oracle(Sun) Hotspot为例来说,Perm,Heap,JVM stack等都有可能发生OOM,如果要解决OOM的问题,首先要定位到底哪个区域发生了问题,而且还要确定到底是内存溢出还是内存泄露,然后针对具体问题类型可以查看一些GC roots引用或者查看一些哪些对象生命周期过长等。
|
|
返回顶楼 | |
发表时间: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级别的。 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2011-08-26
和hibernate无关 over
|
|
返回顶楼 | |
发表时间:2011-08-26
根据LZ提供的信息,貌似是Perm的OOM,可能是CGLIB引起的。
|
|
返回顶楼 | |