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

我在执行测试时收到此错误消息:JUnit

java.lang.OutOfMemoryError: GC overhead limit exceeded

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


答案 1

此消息意味着由于某种原因,垃圾回收器占用了过多的时间(默认情况下是进程所有 CPU 时间的 98%),并且在每次运行中恢复的内存非常少(默认情况下是堆的 2%)。

这实际上意味着您的程序停止执行任何进度,并且始终忙于仅运行垃圾回收。

为了防止您的应用程序在未完成任何操作的情况下占用 CPU 时间,JVM 会抛出此值,以便您有机会诊断问题。Error

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

请查看 Java GC 调优指南,该指南适用于各种 Java 版本,其中包含有关此特定问题的部分:


答案 2

引用甲骨文文章“Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning”

GC 时间过长且内存不足错误

如果在垃圾回收中花费的时间过多,并行收集器将抛出一个 OutOfMemoryError:如果超过 98% 的总时间用于垃圾回收,并且恢复的堆少于 2%,则将引发 OutOfMemoryError。此功能旨在防止应用程序长时间运行,同时由于堆太小而进展甚微或毫无进展。如有必要,可以通过将该选项添加到命令行来禁用此功能。-XX:-UseGCOverheadLimit

编辑:看起来有人可以比我打字更快:)


推荐