【推荐】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楼
对我来说,以下步骤有效:
- 打开
eclipse.ini
文件 更改
-Xms40m -Xmx512m
至
-Xms512m -Xmx1024m
重新启动Eclipse
#5楼
错误原因
超出了GC开销限制”表示垃圾收集器一直在运行,并且Java程序的进度非常缓慢。
进行垃圾回收之后,如果Java进程花费了其大约98%以上的时间用于垃圾回收 ,并且正在恢复的内存少于2%,并且到目前为止已经执行了最后5个(编译时间常数)连续垃圾集合,然后引发java.lang.OutOfMemoryError
- 如果当前堆不够,请增加堆大小 。
- 如果增加堆内存后仍然出现此错误,请使用内存分析工具,例如MAT (内存分析器工具), Visual VM等,并修复内存泄漏。
- 将JDK版本升级到最新版本(1.8.x)或至少1.7.x,并使用G1GC算法。 。 G1 GC的吞吐量目标是90%的应用时间和10%的垃圾收集时间
除了使用
Xms1g -Xmx2g
设置堆内存Xms1g -Xmx2g
,请尝试-XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m -XX:ParallelGCThreads=n -XX:ConcGCThreads=n
看看有关G1GC的一些其他相关问题
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3145336