我执行JUnit测试时收到如下错误消息: html
java.lang.OutOfMemoryError: GC overhead limit exceeded
我知道什么是OutOfMemoryError
,可是GC开销限制是什么意思? 我该如何解决? java
该消息表示因为某种缘由,垃圾收集器占用了过多的时间(默认状况下为该进程全部CPU时间的98%),而且每次运行时恢复的内存不多(默认为堆的2%)。 git
这实际上意味着您的程序中止任何进展,而且一直在忙于仅运行垃圾回收。 github
为了防止您的应用程序浪费CPU时间而不作任何事情,JVM抛出此Error
以便您有机会诊断问题。 算法
我见过这种状况的罕见状况是,某些代码在一个已经很是受内存限制的环境中建立了大量的临时对象和大量的弱引用对象。 oracle
请查看本文以了解详细信息(特别是本部分 )。 eclipse
当在垃圾回收上花费太多时间而返回的次数太少时,GC就会抛出此异常。 GC上花费了98%的CPU时间,而且不到2%的堆被恢复。 ide
此功能旨在防止应用程序长时间运行,而因为堆过小而几乎没有进展,甚至没有进展。 工具
您可使用命令行选项-XX:-UseGCOverheadLimit
将其关闭-XX:-UseGCOverheadLimit
测试
更多信息在这里
编辑:看起来有人能够比我更快地输入:)
只需在如下位置设置此选项便可稍微增长堆大小
运行→运行配置→参数→VM参数
-Xms1024M -Xmx2048M
Xms-最小限制
Xmx-最大限制
对我来讲,如下步骤有效:
eclipse.ini
文件 更改
-Xms40m -Xmx512m
至
-Xms512m -Xmx1024m
从新启动Eclipse
错误缘由
超出了GC开销限制”表示垃圾收集器一直在运行,而且Java程序的进度很是缓慢。
进行垃圾回收以后,若是Java进程花费了其大约98%以上的时间用于垃圾回收 ,而且正在恢复的内存少于2%,而且到目前为止已经执行了最后5个(编译时间常数)连续垃圾集合,而后引起java.lang.OutOfMemoryError
除了使用Xms1g -Xmx2g
设置堆内存Xms1g -Xmx2g
,请尝试
-XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m -XX:ParallelGCThreads=n -XX:ConcGCThreads=n
看看有关G1GC的一些其余相关问题