很简单的一段代码,为什么会报for(int i = 0 ; i< n ; i ++ ){
//这段只是查询数据,每次返回结果最多只有1000行
List list = query.getSql(sql,startResult,size);
}
以上代码,第一次、第二次、第三次、第四次都成功,第五次或者第六次以上的时候就会出现
java.lang.OutOfMemoryError : java heap space 错误,这是为什么求神人指导,谢谢。
//这段只是查询数据,每次返回结果最多只有1000行
List list = query.getSql(sql,startResult,size);
}
以上代码,第一次、第二次、第三次、第四次都成功,第五次或者第六次以上的时候就会出现
java.lang.OutOfMemoryError : java heap space 错误,这是为什么求神人指导,谢谢。
解决方案 »
- SSH2+JBPM4.4发布流程报错
- struts2 工程在 MyEclipse中可以,在Eclipse中不行,谁遇到过吗?
- Java命令好使但是jar就是说不是内部命令
- 请问怎么才能获取这个Beaan
- ff 浏览器编码
- 高分求助(在线等): Eclipse+myeclipse 导入javax.mail.Session时错误????
- 请教:奇怪的问题
- hibernate list中的顺序问题
- tomcat报错信息java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) an
- XML的题目,请大家帮忙做做~~~!?多谢~!~
- 怎么用js获得s:iterator 里的 和?
- Struts1.x下的FormFile 怎么修改上传文件的名称?
getSql的实现挺关键的
回答7楼: 每次返回到list后,接着我就把list = null;..这样的话内存应该没有存5K的数据了吧? 我查看过代码,不存在死循环了. public List getSQLQuery(String sql,int fisrtResult,int row) throws DaoException{
List list=null;
Transaction ts=null;
sess=HibernateSessionFactory.getSessionFactory().openSession();//getCurrentSession();
try {
ts=sess.beginTransaction();
list=sess.createSQLQuery(sql).setFirstResult(fisrtResult).setMaxResults(row).list();
ts.commit();
} catch (Exception e) {
e.printStackTrace();
if(ts!=null){
ts.rollback();
}
throw new DaoException("执行纯T-SQL语句错误",e,"Query_getSQLQuery");
}finally{
if(sess != null){
sess.close();
}
}
return list;
}
代码没看出哪里有问题
换一种写法。。用spring的session管理,不用手动管理session试试看看会不会溢出
public List getSQLQuery(final String sql,final int fisrtResult,final int row) { return (List) this.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createSQLQuery(sql);
query.setFirstResult(fisrtResult);
query.setMaxResults(row);
List list = query.list();
return list;
}
});
}
-Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m
Returns the amount of free memory in the Java Virtual Machine.查看到底哪里内存泄露
回答14楼的,由于项目没用spring管理,突然一加这个东西,会很麻烦的。。
我断点一步一步的调试的时候,前面1、2、3、4、5次到sess.close()的时候,都能正常运行,而当时返回连接也是开着的。。但第六次的时候。返回连接开着,但是sess.close()的时候,就报java.lang.OutOfMemoryError错误了。。
try {
sess=HibernateSessionFactory.getSessionFactory().openSession();//getCurrentSession();
list=sess.createSQLQuery(sql).setFirstResult(fisrtResult).setMaxResults(row).list();
sess.close();
} catch (Exception e) {
e.printStackTrace();
throw new DaoException("执行纯T-SQL语句错误",e,"Query_getSQLQuery");
}将session放进去try中,用完就关闭呢。。不需要事务。。反正只是查询操作。。
但我换成纯JDBC查询的时候,没有报错误,可以排除数据库驱动没问题。。
我hibernate版本是3.1的,是不是hibernate包的问题?????求大神解答疑问。。
利用hql语句查询的方式,看看会不会溢出
list=sess.createQuery(hql).setFirstResult(fisrtResult).setMaxResults(row).list();
这样测试看看
我改成用HQL语句试试也可以辛苦您了,这么晚还关注着。。
谢谢您 。kouyiSC
谢谢你们了,辛苦了,
谢谢kouyiSC 一直关注。。结贴啦。