日期:2014-05-18  浏览次数:20788 次

高分急求解答,不够再给,郁闷好多天了:spring OutOfMemery
spring1.2+hibernate3.2+struts,系统要上线了,发现个大问题,点击spring中含hibernate的内存每次都会泄漏一点,但点击spring里配置的jdbc的没问题,在weblogic监控中表现就是每次内存升到顶再下来时都比上次最低点高一点,就这样每次高点,最后OutOfMemory,weblogic已经分配2G内存。开始以为是hibernate连接没关,后来测试,只要调用一个dao,里面就不用到hibernate,比如就用jdbc查询一个sql,但只要把这个dao配置成hibernate事务,还会出现这个问题。试了好多方法都不行。基本上开几个页面,一直不停的点,20多分钟就把2G内存漏光了。我是专门写了个hibernate基础类,继承HibernateDaoSupport,这个基础类不配事务,业务dao配置事务,统一调用这个基础类,如果基础类报错抛出异常,业务dao捕获后照样回滚,这个没问题的,但就是会内存泄漏:

------解决方案--------------------
那还是hibernate的问题拉
------解决方案--------------------
> > > 只用jdbc做个查询,但还把这个dao配置成hibernate事务拦截
这样可以吗?!既然是用JDBC做查询,怎么会需要hibernate事务拦截呢?不解!
------解决方案--------------------
这种问题基本没办法解决,这是Hibernate的问题,只能减少表之间及联的层次,最好不要超过3张表,其他的手动去更新
------解决方案--------------------
帮你顶起来吧

我不懂这个问题
------解决方案--------------------
如果得不到解决只有跟踪了,装个Jprofile,然后跟踪一下,内存再哪儿发生了泄漏,再寻找合适的解决方法。
hibernate我用的不多,但对内存泄漏还是处理的比较多。
在复杂的事务完成之后,你试着调用一下system.gc()看看是否有所改观?

------解决方案--------------------
解决方案:
1,你用的hibernate事务,所以每次提交前都先清空(调用clear方法),切记最后一定要把工厂等一切不必要的资源都close掉.
2,检验代码,看看不在用到的对象是否都处理过(销毁,清空...),尤其是hibernate这里,实在不行手动处理,因为java的垃圾自动回收机制并不是很好...
3,如过按招上面的做了,还是回出现内存泄漏,那么建议你改用比hibernate事务更健壮的Spring事务,方便、简洁、健壮,绝没有类似的问题。
------解决方案--------------------
是不是没有延迟加载?我有一次就是这个原因,用的是MySQL数据库,查了些资料说MySQL驱动不支持延迟加载,导致我把数据库里的blob字段一下子都读到内存,一会就OutOfMemery,你看看是不是这个原因造成的
------解决方案--------------------
同楼上!!

------解决方案--------------------
在hibernate的数据库操作捕捉异常中,做final处理,执行HibernateSessionFactory的close操作,再做session为null的操作,以防垃圾回收问题
------解决方案--------------------
帮顶~~
------解决方案--------------------
没什么,首先肯定是你程序写的有问题,内存泄漏了,java一样会泄漏的!
第二,你可以用执行参数扩大java虚拟机占有的内存,不过这个方法不是什么好办法,最好的就是去查你的代码去解决你的内存泄漏问题