如何摆脱java.lang.OutOfMemoryError:Java堆空间

时间:2013-05-23 09:06:46

标签: java tomcat jvm heap out-of-memory

我已经浏览了许多与 java.lang.OutOfMemoryError:Java堆空间相关的链接和类似问题,但没有一个解决方案解决了我的问题。所以这是我的问题, 我有一个Web应用程序,用户上传一个记录大约2500的Excel文件,我的应用程序读取该文件的内容并将其插入到数据库中。 但是在插入700条记录之后我得到了异常,因为 throwable object caught = java.lang.OutOfMemoryError:Java堆空间

如果文件包含500或少于500条记录,则相同的代码有效。以下是我的JAVA_OPTS& catalina.bat文件中的CATALINA_OPTS变量

    JAVA_OPTS=-Xmx1536m -XX:MaxPermSize=128m
    CATALINA_OPTS=-Xms512m -Xmx512m

任何人都可以告诉我如何解决这个问题?

4 个答案:

答案 0 :(得分:0)

您可能正在将整个文件加载到内存中。 您是否可以尝试将Excel文件转换为纯文本CSV,然后使用Java类Scanner逐行读取?

Scanner scanner = new Scanner("yourCsvFile.csv");

while (scanner.hasNextLine()) {
    String line = scanner.nextLine();

    //process your line
}

答案 1 :(得分:0)

  

任何人都可以告诉我如何解决这个问题?

听起来你的应用程序中存在内存泄漏(即错误)。没有看到你的代码,我们无法告诉你它在哪里。但是,这些问题的答案解释了如何在Java程序中找到内存泄漏:


我应该指出,您已在JAVA_OPTS和CATALINA_OPTS变量中为堆大小指定了两个不同的值。其中只有一个将生效,但哪一个取决于用于启动Tomcat的脚本的详细信息。

但是,从电子表格上传数据时,正确编写的应用程序不应该耗尽内存。堆大小为512Mb应该足够了。

答案 2 :(得分:0)

您可能正在使用Hibernate插入记录。 Hibernate维护所有已保存对象的会话缓存,并推迟任何实际插入,直到事务提交。您必须每隔100条记录刷新会话缓存。还建议在执行大量插入时禁用二级缓存

与Hibernate批量插入有关的其他几个问题,the official documentation是实施它的任何人的强制阅读。

答案 3 :(得分:0)

你关闭了你的文件流吗?如果你没有关闭文件流,那么堆大小会非常大!然后它会抛出一个OutOfMemoryError异常。所以,检查一下你是否关闭了文件流!