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

imzjd6km  于 2022-11-07  发布在  Java
关注(0)|答案(4)|浏览(191)

我已经浏览了许多与java.lang.OutOfMemoryError相关的链接和类似问题:Java堆空间但是没有一个解决方案解决了我的问题。所以我的问题是,我有一个Web应用程序,其中用户上传了一个Excel文件,其中有大约2500条记录我的应用程序读取此文件的内容,并将它们插入到数据库中。但是在插入700条记录后,我得到了异常throwable object catch = java.lang.OutOfMemoryError:Java堆空间
如果文件包含500条或少于500条记录,则使用相同代码以下是catalina.bat文件中JAVA_OPTS & Catalina _OPTS变量

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

谁能告诉我该怎么做才能解决这个问题?

cngwdvgl

cngwdvgl1#

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

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

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

    //process your line
}
roejwanj

roejwanj2#

您可能正在使用Hibernate来插入记录。Hibernate维护所有已保存对象的 * 会话高速缓存 *,并推迟任何实际插入,直到事务提交。您必须每隔100条记录左右 * 刷新 * 会话高速缓存。还建议在执行大量插入时 * 禁用二级高速缓存 *。
还有其他几个问题与使用Hibernate进行批量插入有关,并且the official documentation对于任何实现它的人来说都是强制阅读。

xurqigkl

xurqigkl3#

是否关闭了文件流?如果不关闭文件流,堆大小将非常大!然后将引发OutOfMemoryError异常。因此,如果关闭了文件流,请进行检查!

tjvv9vkg

tjvv9vkg4#

谁能告诉我该怎么做才能解决这个问题?
在我看来,您的应用程序中似乎存在内存泄漏(即bug)。在没有看到代码的情况下,我们无法告诉您内存泄漏的位置。然而,以下问题的答案解释了如何在Java程序中查找内存泄漏:

我应该指出,您在JAVA_OPTS和 Catalina _OPTS变量中为堆大小指定了两个不同的值,其中只有一个值会生效,但具体哪一个值取决于启动Tomcat所使用的脚本的细节。
然而,一个写得很好的应用程序在从电子表格上传数据时应该不会出现内存不足的情况,512Mb的堆大小应该足够了。

相关问题