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

标签 java garbage-collection out-of-memory heap-memory

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

java.lang.OutOfMemoryError: GC overhead limit exceeded

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

最佳答案

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

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

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

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

查看Java GC调整指南,该指南可用于各种Java版本,并且包含有关此特定问题的部分:

  • Java 11 tuning guide专​​门介绍了用于不同垃圾收集器的过量GC:
  • Parallel Collector
  • Concurrent Mark Sweep (CMS) Collector
  • 没有提及垃圾优先(G1)收集器的此特定错误情况。
  • Java 8 tuning guide及其Excessive GC section
  • Java 6 tuning guide及其Excessive GC section
  • 关于java - 错误java.lang.OutOfMemoryError:超出了GC开销限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45836833/

    相关文章:

    java - 我应该在 Eclipse 中关闭 "Build Automatically"

    java - 如何使用 `adb` 仅为一个用户安装开发应用程序?

    java - Java中静态字段的确切含义是什么?

    java - cache()/persist() 的 apache-spark 内存消耗

    javascript - Vue 实例必须销毁吗?

    java - 添加 hashmap 和 arraylist 时出现内存不足错误

    java - Oracle 引用游标的结果集很慢

    go - 垃圾收集器和延迟函数之间的冲突?

    android 如何在应用程序运行时保持大 List<String[]>

    c++ - 如何读取文件或流直到找到字符串