错误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来禁用限制检查。

    链接地址: http://www.djcxy.com/p/54987.html

    上一篇: Error java.lang.OutOfMemoryError: GC overhead limit exceeded

    下一篇: based Tomcat PermGen Space