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

来自命令行的Java堆空间错误,java,apache-poi,out-of-memory,heap-memory,Java,Apache Poi,Out Of Memory,Heap Memory,我试图创建一个小实用程序,它可以读取excel并发送电子邮件。我正在使用ApachePOI图书馆。当我从eclipse执行代码时,最初我得到了java.lang.OutOfMemoryError:GC开销限制超过了error。然后我在eclipse的VM参数中添加了-Xms1024m,程序在eclipse中运行良好 然后,我将java程序集和库导出到RunnableJar中,并捆绑了依赖库 现在,当我执行命令时,从命令行开始 java -Xms1024m -jar AutomateProcess

我试图创建一个小实用程序,它可以读取excel并发送电子邮件。我正在使用ApachePOI图书馆。当我从eclipse执行代码时,最初我得到了
java.lang.OutOfMemoryError:GC开销限制超过了
error。然后我在eclipse的VM参数中添加了
-Xms1024m
,程序在eclipse中运行良好

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

现在,当我执行命令时,从命令行开始

java -Xms1024m -jar AutomateProcesses.jar

我仍然得到同样的错误。我想不出这个问题。有人能在这方面提供帮助吗?

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

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

您可以尝试

java -Xms512m -Xmx2048 -jar AutomateProcesses.jar
如果这就是虚拟机中发生的事情,这就是我所期望的。如果java进程中的库正在生成一个单独的进程,那么该库可能需要一些其他选项来配置它


编辑:

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

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

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


以类似的方式,他们放弃并将数据写入CSV格式。

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


启用和分析verbose:gc肯定会有所帮助。您还可以生成一个函数,并确定该内存在Java实用程序中保留的位置。您必须调整Java堆大小和/或解决任何错误的内存保留。

可能是您的重复错误刚刚发布,这似乎是垃圾收集的问题。@dasKeks您能告诉我如何解决问题吗?如果您发布整个错误消息,我可以试试。Java-Xms512m-Xmx2048-jarjar这个工作我刚刚发现-Xms也应该工作。因此,我的答案可能不是解决方案。我在Linux终端中遇到了这个错误。但在LinuxEclipse中运行良好。您是否运行64位java?如果是这样,您可以尝试大量增加内存,看看是否有效(假设您有一个相当多的mem/vmem)。这是一个解决办法,不是修复。是的,64位java。。。你能告诉我是什么增加了内存吗