java.lang.OutOfMemoryException:java堆空间

时间:2011-10-23 01:49:52

标签: java

运行以下代码时,我收到错误 java.lang.OutOfMemoryException:java heap space

我的代码是:

public class openofficeupdate {
String databaseurl="C:\\mydbdir\\location\\salesforce"; // Path of the base after renaming and extraction
openofficeupdate() throws ClassNotFoundException, SQLException{
    System.out.println("Entered into constructor");
    Connection connection=null;
    Statement statement=null;
   try{
    Class c=openofficeclass();
    System.out.println("Class name set");

    Connection cntn=createConnection(databaseurl);
    connection=cntn;
    System.out.println("connection created");

    Statement stmt=createStatement(cntn);
    statement=stmt;
    System.out.println("Statement created");

    executeQueries(stmt);
    System.out.println("Query executed");

    closeStatement(stmt);
    System.out.println("Statement closed");

    closeConnection(cntn);
    System.out.println("Connection closed");

    }catch(Exception e){
        System.out.println(e);

        closeStatement(statement);
        System.out.println("Statement closed");

        closeConnection(connection);
        System.out.println("Connection closed");
    }
}
public static void main(String args[]) throws ClassNotFoundException, SQLException{
    new openofficeupdate();
}

private Class openofficeclass() throws ClassNotFoundException {
    return Class.forName("org.hsqldb.jdbcDriver");
}

private Connection createConnection(String databaseurl) throws SQLException{
    return DriverManager.getConnection("jdbc:hsqldb:file:" +databaseurl,"sa","");
}

private Statement createStatement(Connection cntn) throws SQLException{
    return cntn.createStatement();
}

private void closeStatement(Statement stmt) throws SQLException{
    stmt.close();
}

private void closeConnection(Connection cntn) throws SQLException{
    cntn.close();
}

private void executeQueries(Statement stmt) throws SQLException{
    System.out.println("Going to execute query");
    int status=stmt.executeUpdate("insert into \"Mobiles\" values(9874343210,123,'08:30:00','09:30:06')");
          12','2010-12-14','c','Casula')");
    System.out.println("Query executed with status "+status);
 }
}

我正在使用NetBeans IDE ...有没有选项来控制这种错误?

4 个答案:

答案 0 :(得分:4)

如果你在不知道原因的情况下继续增加,你的问题可能无法解决。所以我建议你找到问题的根本原因并从那里解决,

这些是可以用于analyze heap的一些免费工具,可以帮助您摆脱OutOfMemoryError

  • Visualgc : Visualgc代表Visual Garbage Collection Monitoring Tool,您可以将它附加到已检测的hostspot JVM。 visualgc的主要优势在于它以图形方式显示所有关键数据,包括类加载器,垃圾收集和JVM编译器性能数据。 目标JVM由其虚拟机标识符标识,也称为vmid

  • Jmap : Jmap是JDK6附带的命令行实用程序,允许您在文件中获取堆的内存转储。它易于使用,如下所示:

    jmap -dump:format=b,file=heapdump 6054

    此文件指定内存转储文件的名称,即“heapdump”,6054是Java进度的PID。您可以使用“ps -ef”或Windows任务管理器或使用名为“jps”的工具(Java虚拟机进程状态工具)找到PDI。

  • Jhat : Jhat之前被称为hat(堆分析器工具),但它现在是JDK6的一部分。您可以使用jhat分析使用“jmap”创建的堆转储文件。 Jhat也是一个命令行实用程序,您可以从cmd窗口运行它,如下所示:

    jhat -J-Xmx256m heapdump

    这里将分析文件“heapdump”中包含的内存转储。当你启动jhat时它会读取这个堆转储文件,然后开始在http端口上监听,只需将浏览器指向jhat正在监听的端口7000,然后你就可以开始分析堆转储中存在的对象了。

  • Eclipse内存分析器: Eclipse内存分析器(MAT)是一个从eclipse基础开始分析java堆转储的工具。它有助于查找类加载器泄漏和内存泄漏,并有助于最小化内存消耗。您可以使用MAT来分析承载数百万个对象的堆转储,它还可以帮助您提取内存泄漏的可疑内容。

  • VisualVM :VisualVM是一个集成了多个命令行JDK工具和轻量级分析功能的可视化工具。它专为生产和开发时间使用而设计,进一步增强了Java SE平台的监控和性能分析功能。

  • YourKit

礼貌:solution of java.lang.OutOfMemoryError in Java

答案 1 :(得分:3)

在Netbeans 7.0中:

  • 您可以右键单击该项目,然后选择Properties

  • 点击Run类别,然后在VM Options

  • 中插入配置
  • 例如,在您的情况下,按照rm5248的建议粘贴:-Xmx512m(512Mb)

您可以阅读Playing with JVM / Java Heap Size了解更多信息。

答案 2 :(得分:1)

如果堆空间不足,则需要增加堆大小。了解您使用多少内存的方法是运行适当的测试和分析。也就是说,有一些更简单的方法可以让你的应用程序启动和运行......以下是人们用java程序修复或解决内存问题的三个常见问题。

  • 您可以像上一篇文章一样传递-Xmx1028参数。这会增加最大内存。
  • 如果您想从大量内存占用开始,您也可以选择传递-Xms1028。
  • 如果你事先不知道你的记忆要求是什么,你可以传递-XX:+ AggressiveHeap。这不是“官方”最好的做事方式,但我发现在尝试运行一个我还不确定内存要求的新应用程序时,它总能很好地工作。

答案 3 :(得分:0)

-Xmx512m作为参数传递给JVM。这将使您的最大堆大小增加到512 MB。有关其工作原理的详细信息,请参阅http://download.oracle.com/javase/7/docs/technotes/tools/windows/java.html

关于如何在Netbeans中设置它,我不确定;如果我没记错的话,有一个设置,用于运行程序以传递程序的参数,以及JVM的参数。