我是靠谱客的博主 激情煎饼,最近开发中收集的这篇文章主要介绍SSH系统,调用HibernateTemplate.find()方法的时候,会导致内存泄露?,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
(转自:http://www.iteye.com/problems/1697)
SSH系统,调用HibernateTemplate.find()方法的时候,会导致内存泄露?
悬赏:5 发布时间:2008-07-18 提问人:robinzhang (初级程序员)
spring2.0.2 hibernate3.1.2 struts2.0.6,web应用运行一段时间之后,内存使用会越来越大直到outofmemory。
后来测试发现,所有的dao调用了HibernateTemplate.find()之后,内存中就会有org.hibernate.hql.ast.* 这个包中的对象常驻内存,Full gc也不能完全回收(所有用户退出,无活动的session存在)。
以下是我的代码和配置文件,请指教。
基类BaseDao的片段
Service调用
所有的service方法都定义了事务
service只要调用该方法,就会导致org.hibernate.hql.ast.* 包中的一些对象常驻内存。
我不知道hibernate是不是运用了对象池对这些对象进行缓存。如果有的话,也不可能达到100w的级别吧?
我的web应用outofmemory的时候,一般这个时候这个包的对象的总数是百万级别。
再次谢谢指教
问题补充:
从我用Jprofiler监测的结果看HibernateTemplate的get(),load()方法都没有问题,只有在调用find的时候会生成一些hql解析的中间变量没有回收回来。
问题补充:
问题已经解决,是因为自己编写的DAO基类有拼装HQL的行为,而且不是采用的参数化的HQL,所以导致每次查询的时候都会是一条不同的HQL(hibernate会缓存hql的解析结果,应该是通过hql做为Key值来保存)这样hibernate就会保存很多hql的缓存。导致系统运行时间长了之后,内存逐渐被占用直到最后的oom。
谢谢大家的关注,我关闭问题了。
该问题已经关闭: 自己解决。
后来测试发现,所有的dao调用了HibernateTemplate.find()之后,内存中就会有org.hibernate.hql.ast.* 这个包中的对象常驻内存,Full gc也不能完全回收(所有用户退出,无活动的session存在)。
以下是我的代码和配置文件,请指教。
基类BaseDao的片段
- public Object getObject(Class clazz, String[] fields, Object[] values) {
- List list = getObjectList(clazz, fields, values);
- return (list.size() > 0) ? list.get(0) : null;
- }
Service调用
- Depot depot = (Depot) depotDao.getObject(Depot.class, new String[] {
- "phoneNumber", "depotId.ringIndex" }, new Object[] {
- portalUser.getPhoneNumber(), ringIndex });
- if (depot == null) {
- return null;
- }
- //该方法调用HibernateTemplate.get()获取结果
- Ring ring = ringDao.getRing(depot.getDepotId().getRingIndex());
- depot.setChargeable(ring);
- return depot;
- }
所有的service方法都定义了事务
service只要调用该方法,就会导致org.hibernate.hql.ast.* 包中的一些对象常驻内存。
我不知道hibernate是不是运用了对象池对这些对象进行缓存。如果有的话,也不可能达到100w的级别吧?
我的web应用outofmemory的时候,一般这个时候这个包的对象的总数是百万级别。
再次谢谢指教
问题补充:
从我用Jprofiler监测的结果看HibernateTemplate的get(),load()方法都没有问题,只有在调用find的时候会生成一些hql解析的中间变量没有回收回来。
问题补充:
问题已经解决,是因为自己编写的DAO基类有拼装HQL的行为,而且不是采用的参数化的HQL,所以导致每次查询的时候都会是一条不同的HQL(hibernate会缓存hql的解析结果,应该是通过hql做为Key值来保存)这样hibernate就会保存很多hql的缓存。导致系统运行时间长了之后,内存逐渐被占用直到最后的oom。
谢谢大家的关注,我关闭问题了。
该问题已经关闭: 自己解决。
最后
以上就是激情煎饼为你收集整理的SSH系统,调用HibernateTemplate.find()方法的时候,会导致内存泄露?的全部内容,希望文章能够帮你解决SSH系统,调用HibernateTemplate.find()方法的时候,会导致内存泄露?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复