我试图创建一个读取excel并发送电子邮件的小实用程序。我正在使用ApachePOI库。当我从eclipse执行代码时,最初我遇到java.lang.OutOfMemoryError: GC overhead limit exceeded
错误。然后我在eclipse的VM Arguments中添加了-Xms1024m
,程序在eclipse中运行良好。
然后我将一组java程序和库导出到RunnableJar中并捆绑了依赖库。
现在从命令行执行命令
java -Xms1024m -jar AutomateProcesses.jar
我仍然遇到同样的错误。我无法弄清楚这个问题。有人可以帮忙吗?
答案 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堆大小和/或解决任何错误的内存保留。