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

≡放荡痞女 提交于 2019-12-20 15:22:34

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

java.lang.OutOfMemoryError: GC overhead limit exceeded

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


#1楼

该消息表示由于某种原因,垃圾收集器占用了过多的时间(默认情况下为该进程所有CPU时间的98%),并且每次运行时恢复的内存很少(默认为堆的2%)。

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

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

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

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


#2楼

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

此功能旨在防止应用程序长时间运行,而由于堆太小而几乎没有进展,甚至没有进展。

您可以使用命令行选项-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微调的文章

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!