本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
问题
我在使用 JUnit 进行代码测试时,得到如下报错信息:
java.lang.OutOfMemoryError: GC overhead limit exceeded
我知道一个 OutOfMemoryError,但 GC 开销限制是什么意思?我该如何解决这个问题?
回答
回答 1
给出的报错信息是由于某种原因,导致垃圾回收器占用了过多的时间(默认情况下占据了所有进程 CPU 时间的 98%),而且在每次 GC 期间只释放了极少的内存(莫仍情况下只释放了占用栈的 2%)。
这就意味着你的程序基本就停止了运行,而且一直在忙着垃圾回收。为了防止应用程序占用 CPU 时间而不做任何工作,JVM 此时就选择抛出该异常,从而方便你去解决这个问题。
我所见过的一种极端情况就是,一些代码在一个内存非常受限的环境中又创建了大量的临时对象和弱引用对象。
关于更多 Java GC 调优的内容,可以关注一些如下的一些资料:
回答 2
如果你确定你的程序中没有发生内存泄露,那么可以尝试如下方法:
- 增加堆的大小,比如
-Xmx1g; - 启用并发的低暂停收集器,
-XX:+UseConcMarkSweepGC; - 尽可能重用现有对象从而节省内存;
如果有必要,还可以通过向命令行添加如下选项来禁用限制检查。
-XX:-UseGCOVerheadLimint
出处
文章翻译自 Stack Overflow:Error java.lang.OutOfMemoryError: GC overhead limit exceeded