来自命令行的 Java 堆空间错误

Posted

技术标签:

【中文标题】来自命令行的 Java 堆空间错误【英文标题】:Java Heap Space error from command line 【发布时间】:2013-02-13 07:14:27 【问题描述】:

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

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

当我执行命令时从命令行开始

java -Xms1024m -jar AutomateProcesses.jar

我仍然遇到同样的错误。我无法弄清楚这个问题。有人可以在这方面提供帮助吗?

【问题讨论】:

GC overhead limit exceeded 的可能重复项 您刚刚发布了错误,看来是您的垃圾收集有问题。 @dasKeks 你能告诉我如何解决这个问题吗? 如果您发布整个错误消息,我可以尝试。 java -Xms512m -Xmx2048 -jar AutomateProcesses.jar 这个工作 【参考方案1】:

你可以试试

java -Xms512m -Xmx2048 -jar AutomateProcesses.jar

如果这只是我所期望的虚拟机中发生的事情。如果 java 进程中的库随后生成一个单独的进程,则该库可能需要一些其他选项来配置它。


编辑:

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

您能否尝试将存在此问题的代码隔离到一个较小的测试用例中?

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

类似地,this person 放弃并将他们的数据写入 CSV 格式。

【讨论】:

我在 Linux 终端中收到此错误。但在 linux eclipse 中工作正常。 您运行的是 64 位 java 吗?如果是这样,您可以尝试增加内存,看看是否有效(假设您有相当多的 mem/vmem)。这是一种解决方法而不是修复方法。 是的 64 位 java...你能告诉我什么在增加内存吗? java -Xms512m -Xmx4096 -jar AutomateProcesses.jar java -Xms512m -Xmx2048 -jar AutomateProcesses.jar 这个工作:)【参考方案2】:

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

-Xms 分别设置初始堆大小的最小值。

【讨论】:

我刚刚发现 -Xms 也应该可以工作。所以我的答案可能不是解决方案。【参考方案3】:

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

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

启用和分析 verbose:gc 肯定会有所帮助。您还可以生成JVM Heap Dump 并确定该内存在Java 实用程序中的保留位置。您将不得不调整 Java 堆大小和/或解决任何错误的内存保留问题。

【讨论】:

以上是关于来自命令行的 Java 堆空间错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用命令行为JAVA分配空间[重复]

来自命令行的 ms 语音

来自命令行的 xfail pytest 测试

无法识别来自命令行的 cppcheck

来自命令行的 xcodebuild:文件的编译标志

来自命令行的颠覆(svn):任何一个“反映所有更改”的命令?