【问题标题】:How to get rid off java.lang.OutOfMemoryError: Java heap space如何摆脱 java.lang.OutOfMemoryError: Java heap space
【发布时间】:2013-05-18 13:37:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你用什么来阅读电子表格?
  • 当然,您必须重新考虑执行的操作。不要尝试一步读取所有约 2500 条记录。使这个过程迭代。我的意思是,读取部分数据,将其插入到您的数据库中。重复这个过程直到你到达终点。
  • @Bob Flannigon : JExcelApi 用于读取 Excel 文件

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


【解决方案1】:

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

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

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

    //process your line
}

【讨论】:

    【解决方案2】:

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

    还有一些其他问题与使用 Hibernate 的批量插入有关,the official documentation 是任何实现它的人的必读内容。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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


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

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

        【讨论】:

        • 感谢您的回答,您能告诉我应该进行哪些更改以使堆大小为 512Mb 吗?因为我的 tomcat 管理器总是显示 Max memory: 247.50 MB for JVM
        猜你喜欢
        • 2012-08-03
        • 2018-12-25
        • 2014-06-15
        • 2016-04-15
        • 2010-09-07
        • 2011-10-07
        相关资源
        最近更新 更多