我有一个
java.lang.OutOfMemoryError: GC overhead limit exceeded
分裂一些字符串。有趣的是,内存都没用完,垃圾收集器也不会发疯:
异常出现在11点10分,当时Eclipse在实际抛出异常之前冻结了程序。所以11点10分之后的所有事情都可能只是噪音。
我在长期运行的程序中反复遇到这个问题,但我不知道如何避免它。即使分配更多的内存也只会延迟,但不能阻止它。
答案 0 :(得分:2)
你正在使用stop-the-world GC(可能是Parallel Scavenge)。这个例外是因为GC需要太多时间,这可能超过总执行时间的98%。在这种情况下,JVM会杀死进程,因为没有真正的工作。
解决方案可能是:
-XX:-UseGCOverheadLimit
忽略此GC时间限制,这可能会导致问题,因为JVM一直在使用GC而不是实际工作; -XX:+HeapDumpOnOutOfMemoryError
转储内存跟踪并分析跟踪。更多解释为什么堆不满但GC超限(所有这些都是猜测,需要更多的跟踪来确定原因): 这可以是