异常java.lang.OutOfMemoryError:Java堆空间

时间:2016-08-10 09:18:59

标签: java mysql arraylist resultset

使用的IDE:Netbeans 8.1。

从MySQL数据库中读取大数据。以下是我的代码:

List outer=new ArrayList<String>();
List inner=new ArrayList<String>();
Connection con;
Statement stmt;
ResultSet rs;
ResultSetMetaData rsmd;
int columnNumber;
try{
    Class.forName("com.mysql.jdbc.Driver");
    con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");
    stmt=con.createStatement();
    rs=stmt.executeQuery("select * from mytable where srno<1000");
    rsmd=rs.getMetaData();
    columnNumber=rsmd.getColumnCount();
    while(rs.next()){
        for(int i=1;i<columnNumber;i++){
            inner.add(rs.getString(i));
        }
        outer.add(inner);
    }           
    System.out.println("\t" + outer);
    rs.close();
    con.close();
}catch(Exception e){
    System.out.println(e);
}

运行代码时遇到错误:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

我已尝试在属性中设置vm选项&gt;运行&gt; VM选项:-Xmx1024m

我仍然遇到同样的错误。我该如何解决?

1 个答案:

答案 0 :(得分:4)

看看这段代码:

   while(rs.next()){
     for(int i=1;i<columnNumber;i++){
         inner.add(rs.getString(i));
     }
     outer.add(inner);
   }   

对于表中的每一行,您要将每个列值添加到列表中,并将每个列表添加到另一个列表中。因此,如果您的表有100万行,每行有5列。您正在创建500万行。内存耗尽是一件令人惊讶的事吗?根据您的更新,它实际上有1000万行和45列。你意识到你正在制造4.5亿个物体!

另外请记住,由于对象标题和其他内容,外部列表中的每个项目占用的空间将超过这些列在数据库上占用的空间量。

你已经解释了这个用途,例如,对于一个swing应用程序,你可以选择一个适合的TableModel并避免一次将整个db加载到内存中。