代码如下:
        rs = 传入的参数。数据库结果集(ResultSet)
            List records = new ArrayList();
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnCount = rsmd.getColumnCount();
            while (rs.next()) {
                Map row = new HashMap(columnCount);
                for (int i = 1; i <= columnCount; i++) {
                    row.put(rsmd.getColumnName(i), rs.getObject(i));
                }
                records.add(row);
            }           return records;
当结果集rs中的纪录达到9万条时,就会出现内存溢出的现象。
原因是while中每一次都实例化一个Map对象。记录数一多就会出现内存溢出。
我尝试着把程序改成如下:
        rs = 传入的参数。数据库结果集(ResultSet)
            List records = new ArrayList();
            ResultSetMetaData rsmd = rs.getMetaData();
            int columnCount = rsmd.getColumnCount();
            Map row = new HashMap(columnCount);
            while (rs.next()) {
                for (int i = 1; i <= columnCount; i++) {
                    row.put(rsmd.getColumnName(i), rs.getObject(i));
                }
                records.add(row);
                row.Clear();
            }           return records;
但是结果是返回结果records中所有的值都为空。
请问怎样才能在程序中避免发生内存溢出。难道要使用克隆(clone)?在这里能用吗?
如果能用的话应该怎样使用。最好有例子。:)

解决方案 »

  1.   

    用你的第二种方法试试
    把new放在while里面,当map用完后就清除掉
    一定要把new放在里面,不然就是空的了
      

  2.   

    对象是引用,你把row 清除自然也把records中的row清除了.我觉得你试试用多线程,这边一旦提取到规定数量的数据,就把它分发出去.然后清空List,继续接收.
      

  3.   

    任何情况下都应该避免一个sql语句取出上万条数据
    要考虑数据库分页
      

  4.   

    最近被强迫做了一个 一个sql语句 取 上百万条数据的 程序
    还不能分页最后发现,影响速度的 不是java程序的运行,反而是 页面显示的时候花了好多时间
      

  5.   

    chtfallcn(hawk)
    数据库中的数据量很大,查询一次要很长时间。我就是想减少查询数据库的次数。一次取出来10万条记录。
    有没有什么方法把这个程序改一改,避免内存泄漏?
    -------------------------------我相信,你减少数据库查询带来的性能提高远远小于你浪费的性能。在java中处理或查询的性能和数据库是没法比的。
      

  6.   

    如果必须一次取出很多记录,用-Xms -Xmx参数运行程序,可以缓解内存溢出问题;不过建议还是修改算法,否则现在的数据是10万条,以后数据会更多,问题还是无法解决
      

  7.   

    1.减少读取不必要的字段数据
    2.找开源的内存数据库来维护数据,而不是自己编码维护
    3.使用数据库视图/储存过程功能来实现楼主的要求
    4.如 qiubinc() 所言要加大jvm内存