很简单的一段代码,为什么会报for(int i = 0 ; i< n ; i ++ ){
                //这段只是查询数据,每次返回结果最多只有1000行
               List list = query.getSql(sql,startResult,size);             
          }
以上代码,第一次、第二次、第三次、第四次都成功,第五次或者第六次以上的时候就会出现
java.lang.OutOfMemoryError : java heap space 错误,这是为什么求神人指导,谢谢。

解决方案 »

  1.   

    看一下query.getSql(参数1,...)方法,里面是不是没有关闭与数据库之间的连接,如果所有的连接都分配出去了就会报内存溢出的错误。
      

  2.   

    比较内存的话,看前几次之间的内存变化也能看出一些
    getSql的实现挺关键的
      

  3.   

    我数据库连接关闭了..我把查询方法贴出来,请大神们帮帮忙了.
    回答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;
    }
      

  4.   


    代码没看出哪里有问题
    换一种写法。。用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;
    }
    });
    }
      

  5.   

    Transaction ts= 要关闭啊!
      

  6.   

    用我14楼的方法做了没?问题出在List list = query.list();?
      

  7.   

    程序运行到sess.close()方法的时候就报错了。可是我每次都关了连接了。为什么运行到第五次的时候在关闭连接的时候就报一个这样的错误了???  
      

  8.   

    -Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m
      

  9.   

    增加你容器内存
    -Xms512m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m
      

  10.   

    看不出来的话,在某些关键节点安插Runtime类的freeMemory() 
              Returns the amount of free memory in the Java Virtual Machine.查看到底哪里内存泄露
      

  11.   

    我不想扩大容器来解决问题,我觉得这样问题得不到最终的解决。
    回答14楼的,由于项目没用spring管理,突然一加这个东西,会很麻烦的。。
    我断点一步一步的调试的时候,前面1、2、3、4、5次到sess.close()的时候,都能正常运行,而当时返回连接也是开着的。。但第六次的时候。返回连接开着,但是sess.close()的时候,就报java.lang.OutOfMemoryError错误了。。
      

  12.   


            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中,用完就关闭呢。。不需要事务。。反正只是查询操作。。
      

  13.   

    测试代码,真没有问题 ,我用hibernate手动关闭session和hibernate自动关闭session都有测试过,问题都出在关闭连接。。
       但我换成纯JDBC查询的时候,没有报错误,可以排除数据库驱动没问题。。
    我hibernate版本是3.1的,是不是hibernate包的问题?????求大神解答疑问。。
      

  14.   

    那这样测试一下:将list=sess.createSQLQuery(sql).setFirstResult(fisrtResult).setMaxResults(row).list();改成
    利用hql语句查询的方式,看看会不会溢出
    list=sess.createQuery(hql).setFirstResult(fisrtResult).setMaxResults(row).list();
    这样测试看看
      

  15.   

    我这人就是这样子,出了问题,没找到根源,我就不会去想其它办法。。
      我改成用HQL语句试试也可以辛苦您了,这么晚还关注着。。
      

  16.   

    用HQL语句执行。。也还是报这个错误。。我在这之中我换成JDBC查询的时候,没有报这个错了明天我在下个hibernate最新包试试,看是不是这个原因。
      谢谢您 。kouyiSC
      

  17.   

    http://xunbingjin.blog.163.com/blog/static/119512780201024101914613/换个3.2版本的你去看看这个博客有说明
      

  18.   

    OM时把内存dump出来,然后分析dump文件,还有jvm参数设置是否正确
      

  19.   

    今天打算换个hibernate的包试试
      

  20.   

    应该不需要分析了。。已经知道问题代码段我怀疑是不是LZ的jvm参数配置的过于低了本身hibernate要比jdbc耗资源些。。
      

  21.   

    创建过多的对象我以前也碰到过的。设置好JVM参数就行。
      

  22.   

    最终还是败给了hibernate,我还是用JDBC先完成吧,如果我改JVM参数,当程序发布的时候,给实施人员造面麻烦。
       谢谢你们了,辛苦了,
       谢谢kouyiSC 一直关注。。结贴啦。
      

  23.   

    最后说一句,我把JVM参数设一下后,没在出现这个问题了。。扩大JVM当前可以解决,但当数据超过JVM参数的时候,我估计还是会报这个错误。