我试图创建一个小工具,它读取Excel和时发送电子邮件。 我使用ApachePOI库这一点。 当我从执行日食的代码,起初我java.lang.OutOfMemoryError: GC overhead limit exceeded
的错误。 然后我说-Xms1024m
在Eclipse的VM参数和程序在Eclipse工作得很好。
然后我出口的一套Java程序和库到RunnableJar和捆绑的依赖库。
现在,在命令行,当我执行命令
java -Xms1024m -jar AutomateProcesses.jar
我仍然得到同样的错误。 我无法弄清楚这个问题。 可能有人请这方面的帮助?
你可以试试
java -Xms512m -Xmx2048 -jar AutomateProcesses.jar
如果这仅仅是什么在这个VM回事这是我的期望。 如果在java程序的一个库,然后生成一个单独的进程,则库可能需要一些其他的选项来配置它。
编辑:
要回答这个问题,指出这个错误是因为GC花费太多时间试图恢复记忆,并没有得到它。 我不是很熟悉Appache POI但如果是从Java那么它可能是使用COM交谈,Excel调用到Excel中的DLL。 这可能是因为存在库中,或者你使用它的方式错误,导致物体被锁定垃圾收集的,因此GC非常努力进展不大。
你可以尝试找出有这个问题到一个较小的测试案例的代码?
这个职位也有类似的问题,到这样的程度,他们重新写他们正在处理与Excel单元格的方式,从而避免产生大量cellStyle对象。
与此类似, 此人放弃了,并写了数据到CSV格式。
要设置最大堆大小,并允许Java虚拟机分配更多的内存,您必须使用命令-Xmx1024M
(或-Xmx1G
)。
-Xms分别设置的最小初始堆大小。
java.lang.OutOfMemoryError: GC开销超出限制与JVM垃圾回收(GC中花费了太多的时间)问题的征兆。 错误实际上是防止整个JVM在挂起状态去这样你就可以收集一些额外的统计数据。
读取Excel工作表可以根据该文件有多大,这将压力点添加到GC进程占用大量内存。
启用和详细的分析:GC肯定会有所帮助。 你也可以生成一个JVM堆转储 ,并确定在内存中保留您的Java应用程序。 你将不得不要么调整Java堆大小和/或解决任何故障记忆保留。