1

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

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

现在在我执行命令时从命令行

java -Xms1024m -jar AutomateProcesses.jar

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

4

3 回答 3

1

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

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

于 2013-02-27T13:05:05.697 回答
1

你可以试试

java -Xms512m -Xmx2048 -jar AutomateProcesses.jar

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


编辑:

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

你能试着把有这个问题的代码隔离到一个更小的测试用例中吗?

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

同样,这个人放弃了并将他们的数据写入 CSV 格式。

于 2013-02-27T13:05:27.597 回答
0

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

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

Enabling and analyzing verbose:gc will definitely help. You could also generate a JVM Heap Dump and determine where that memory is retained in your Java utility program. You will have to either adjust the Java heap size and / or resolve any faulty memory retention.

于 2013-08-26T11:14:06.953 回答