错误java.lang.OutOfMemoryError:超出了GC开销限制

我执行JUnit测试时收到如下错误消息: html

java.lang.OutOfMemoryError: GC overhead limit exceeded

我知道什么是OutOfMemoryError ,可是GC开销限制是什么意思? 我该如何解决? java


#1楼

该消息表示因为某种缘由,垃圾收集器占用了过多的时间(默认状况下为该进程全部CPU时间的98%),而且每次运行时恢复的内存不多(默认为堆的2%)。 git

这实际上意味着您的程序中止任何进展,而且一直在忙于仅运行垃圾回收。 github

为了防止您的应用程序浪费CPU时间而不作任何事情,JVM抛出此Error以便您有机会诊断问题。 算法

我见过这种状况的罕见状况是,某些代码在一个已经很是受内存限制的环境中建立了大量的临时对象和大量的弱引用对象。 oracle

请查看本文以了解详细信息(特别是本部分 )。 eclipse


#2楼

当在垃圾回收上花费太多时间而返回的次数太少时,GC就会抛出此异常。 GC上花费了98%的CPU时间,而且不到2%的堆被恢复。 ide

此功能旨在防止应用程序长时间运行,而因为堆过小而几乎没有进展,甚至没有进展。 工具

您可使用命令行选项-XX:-UseGCOverheadLimit将其关闭-XX:-UseGCOverheadLimit 测试

更多信息在这里

编辑:看起来有人能够比我更快地输入:)


#3楼

只需在如下位置设置此选项便可稍微增长堆大小

运行→运行配置→参数→VM参数

-Xms1024M -Xmx2048M

Xms-最小限制

Xmx-最大限制


#4楼

对我来讲,如下步骤有效:

  1. 打开eclipse.ini文件
  2. 更改

    -Xms40m -Xmx512m

    -Xms512m -Xmx1024m
  3. 从新启动Eclipse

看这里


#5楼

错误缘由

超出了GC开销限制”表示垃圾收集器一直在运行,而且Java程序的进度很是缓慢。

进行垃圾回收以后,若是Java进程花费了其大约98%以上的时间用于垃圾回收 ,而且正在恢复的内存少于2%,而且到目前为止已经执行了最后5个(编译时间常数)连续垃圾集合,而后引起java.lang.OutOfMemoryError

  1. 若是当前堆不够,请增长堆大小
  2. 若是增长堆内存后仍然出现此错误,请使用内存分析工具,例如MAT (内存分析器工具), Visual VM等,并修复内存泄漏。
  3. 将JDK版本升级到最新版本(1.8.x)或至少1.7.x,并使用G1GC算法。 。 G1 GC的吞吐量目标是90%的应用时间和10%的垃圾收集时间
  4. 除了使用Xms1g -Xmx2g设置堆内存Xms1g -Xmx2g ,请尝试

    -XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m -XX:ParallelGCThreads=n -XX:ConcGCThreads=n

看看有关G1GC的一些其余相关问题

G1上的Java 7(JDK 7)垃圾收集和文档

生产中的Java G1垃圾回收

Oracle TechNetwork关于GC微调的文章

相关文章
相关标签/搜索