gpt4 book ai didi

java - GC 开销超出限制,但内存剩余

转载 作者:行者123 更新时间:2023-12-02 03:18:18 25 4
gpt4 key购买 nike

我有一个

java.lang.OutOfMemoryError: GC overhead limit exceeded

同时分割一些字符串。有趣的是,内存既没有被用完,垃圾收集器也没有变得疯狂: JVisualVM output

异常出现在 11:10,当时 Eclipse 在实际抛出异常之前卡住了程序。所以 11:10 之后的一切可能都只是噪音。

我在长时间运行的程序中反复遇到这个问题,但我不知道如何避免它。即使分配更多的内存也只会延迟而不是阻止它。

最佳答案

您正在使用 stop-the-world GC(可能是 Parallel Scavenge)。此异常是因为 GC 花费了太多时间,可能超过总执行时间的 98%。在这种情况下,JVM 会终止该进程,因为没有执行任何实际工作。

解决方案可能是:

  1. 尝试其他类型的 GC,例如并发标记扫描,它不是 stop-the-world GC;
  2. 尝试更大的内存,这样GC就不会那么频繁;
  3. 使用-XX:-UseGCOverheadLimit忽略这个GC时间限制,这可能会导致问题,因为JVM一直在GC上工作而不是真正的工作;
  4. 如上所述,使用 -XX:+HeapDumpOnOutOfMemoryError 转储内存跟踪并分析该跟踪。

再解释一下为什么堆未满但 GC 超出限制(所有这些都是猜测,需要更多跟踪来确定原因):这可以是

  1. 年轻代太小或大多数对象在次要 GC 中幸存下来,因此 GC 发生得太频繁和/或花费很长时间移动对象(这可以通过更改堆上年轻代的大小或通过某些 JVM 更改对象保有率来调整)旗帜);
  2. 年老代大小太小,导致Minor GC幸存的对象无法放入年老代,从而导致频繁的Major GC(或全堆GC)。

关于java - GC 开销超出限制,但内存剩余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39995659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com