错误java.lang.OutOfMemoryError:超出GC开销限制
在执行我的JUnit测试时出现此错误消息:
java.lang.OutOfMemoryError: GC overhead limit exceeded
我知道OutOfMemoryError
是什么,但GC开销限制意味着什么? 我该如何解决这个问题?
此消息意味着由于某种原因,垃圾回收器需要花费过多的时间(默认情况下占进程CPU时间的98%),并且在每次运行中恢复的内存很少(默认为堆的2%)。
这实际上意味着您的程序停止任何进度,并且正忙着只运行垃圾回收。
为了防止应用程序在没有完成任何事情的情况下吸收CPU时间,JVM会抛出此Error
以便您有机会诊断问题。
在我看到这种情况发生的罕见情况下,一些代码在已经很内存受限的环境中创建了大量的临时对象和大量弱引用的对象。
看看这篇文章的细节(特别是这部分)。
如果在垃圾回收中花费太多时间来回收太少,GC会抛出这个异常,例如。 98%的CPU时间用于GC,并且小于2%的堆被恢复。
此功能旨在防止应用程序长时间运行,而由于堆太小,因此很少或没有进度。
您可以使用命令行选项-XX:-UseGCOverheadLimit
关闭此-XX:-UseGCOverheadLimit
更多信息在这里
编辑:看起来像有人可以输入比我快:)
如果您确定程序中没有内存泄漏,请尝试:
-Xmx1g
。 -XX:+UseConcMarkSweepGC
。 如有必要,可以通过在命令行中添加选项-XX:-UseGCOverheadLimit
来禁用限制检查。
上一篇: Error java.lang.OutOfMemoryError: GC overhead limit exceeded