命令行中的Java堆空间错误

时间:2013-02-27 13:02:19

标签: java apache-poi out-of-memory heap-memory

我试图创建一个读取excel并发送电子邮件的小实用程序。我正在使用ApachePOI库。当我从eclipse执行代码时,最初我遇到java.lang.OutOfMemoryError: GC overhead limit exceeded错误。然后我在eclipse的VM Arguments中添加了-Xms1024m,程序在eclipse中运行良好。

然后我将一组java程序和库导出到RunnableJar中并捆绑了依赖库。

现在从命令行执行命令

java -Xms1024m -jar AutomateProcesses.jar

我仍然遇到同样的错误。我无法弄清楚这个问题。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

要设置最大堆大小并允许Java VM分配更多内存,您必须使用命令-Xmx1024M(或-Xmx1G)。

-Xms分别设置最小堆大小。

答案 1 :(得分:1)

你可以尝试

java -Xms512m -Xmx2048 -jar AutomateProcesses.jar

如果这只是在这个VM中发生了什么,这是我所期望的。如果java进程中的库正在生成一个单独的进程,那么库可能需要一些其他选项来配置它。


编辑:

this question的回答指出,这个错误是因为GC花了太多时间试图恢复内存而没有得到它。我对Appache POI不是很熟悉,但是如果它是从java与Excel交谈那么它可能是在Excel中使用COM调用。可能是库中存在错误或者您使用它的方式,导致对象被锁定在垃圾收集之外,因此GC工作非常困难,几乎没有进展。

您是否可以尝试将具有此问题的代码隔离到较小的测试用例中?

这个post有一个类似的问题,他们重写了他们在Excel中处理单元格的方式,以避免创建大量的cellStyle对象。

与此类似,this person放弃并将数据写入CSV格式。

答案 2 :(得分:0)

java.lang.OutOfMemoryError:GC overhead limit exceeded是JVM垃圾收集问题的症状(在GC中花费了太多时间)。该错误实际上阻止了整个JVM进入挂起状态,因此您可以收集一些额外的统计信息。

读取Excel表格可能会占用大量内存,具体取决于文件的大小,这会为GC流程增加压力点。

启用和分析详细信息:gc肯定会有所帮助。您还可以生成JVM Heap Dump并确定Java实用程序中保留内存的位置。您必须调整Java堆大小和/或解决任何错误的内存保留。