-1

我经历了许多与 java.lang.OutOfMemoryError: Java heap space相关的链接和类似问题,但没有一个解决方案解决了我的问题。所以这是我的问题,我有一个 Web 应用程序,用户在其中上传一个 Excel 文件,其中包含大约 2500 条记录,我的应用程序读取该文件的内容并将它们插入数据库。但在插入 700 条记录后,我收到异常作为可抛出对象被捕获 = java.lang.OutOfMemoryError: Java heap space

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

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

谁能告诉我可以做些什么来解决这个问题?

4

4 回答 4

0

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

还有其他几个与使用 Hibernate 进行批量插入有关的问题,官方文档对于任何实现它的人来说都是必读的。

于 2013-05-23T09:14:03.543 回答
0

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

于 2013-05-23T09:17:56.037 回答
0

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

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

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

    //process your line
}
于 2013-05-23T09:09:55.130 回答
0

谁能告诉我可以做些什么来解决这个问题?

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


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

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

于 2013-05-23T09:12:01.673 回答