我已经浏览了许多与 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
任何人都可以告诉我如何解决这个问题?
答案 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异常。所以,检查一下你是否关闭了文件流!