本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接
错误java.lang.OutOfMemoryError:超出了GC开销限制
我执行JUnit测试时收到以下错误消息:
java.lang.OutOfMemoryError: GC overhead limit exceeded
我知道这OutOfMemoryError是什么,但是GC开销限制是什么意思?我该如何解决?
高分回答:
此消息表示由于某种原因,垃圾收集器占用了过多的时间(默认情况下为该进程所有CPU时间的98%),并且每次运行时恢复的内存很少(默认为堆的2%)。
这实际上意味着您的程序停止任何进展,并且一直在忙于仅运行垃圾回收。
为了防止您的应用程序浪费CPU时间而不做任何事情,JVM抛出此错误,Error以便您有机会诊断问题。
我见过这种情况的罕见情况是,某些代码在已经非常受内存限制的环境中创建了大量的临时对象和大量的弱引用对象。
查阅Java GC调整指南,该指南可用于各种Java版本,并包含有关此特定问题的部分:
Java 11调优指南针对过多的GC为不同的垃圾收集器提供了专门的章节:
为并行收集器
对于并发标记扫描(CMS)集电极
没有提及垃圾优先(G1)收集器的此特定错误情况。
Java 8调优指南及其“ GC过多”部分
高分回答:
如果当前堆不够,请增加堆大小。 如果增加堆内存后仍然出现此错误,请使用内存分析工具,例如MAT(内存分析器工具),Visual VM等,并修复内存泄漏。 将JDK版本升级到最新版本(1.8.x)或至少1.7.x,并使用G1GC算法。。G1 GC的吞吐量目标是90%的应用时间和10%的垃圾收集时间
除了使用-设置堆内存之外Xms1g -Xmx2g,请尝试
-XX:+UseG1GC -XX:G1HeapRegionSize=n -XX:MaxGCPauseMillis=m
-XX:ParallelGCThreads=n -XX:ConcGCThreads=n
文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/1…
作者建议: 除了上述方法,我建议使用jstack查看线程的堆栈信息,查看各个线程的状态,针对异常线程状态排查,例如:死锁,第二:jmap 查看使用堆容量排序 第三:jps查看java进程,top查看系统资源,第四:利用阿尔萨斯排查
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️