Java 超出了GC开销限制,但内存不足
我有一个Java 超出了GC开销限制,但内存不足,java,garbage-collection,Java,Garbage Collection,我有一个 java.lang.OutOfMemoryError: GC overhead limit exceeded 在分割一些字符串时。有趣的是,内存没有用完,垃圾收集器也没有发疯: 异常出现在11:10,当时Eclipse在实际抛出异常之前冻结了程序。所以11:10之后的一切可能只是噪音 我在长期运行的程序中反复遇到这个问题,但我不知道如何避免它。即使分配更多的内存也只会延迟但不会停止它。您正在使用stop the world GC(可能是并行清除)。此异常是因为GC花费的时间太长,可能
java.lang.OutOfMemoryError: GC overhead limit exceeded
在分割一些字符串时。有趣的是,内存没有用完,垃圾收集器也没有发疯:
异常出现在11:10,当时Eclipse在实际抛出异常之前冻结了程序。所以11:10之后的一切可能只是噪音
我在长期运行的程序中反复遇到这个问题,但我不知道如何避免它。即使分配更多的内存也只会延迟但不会停止它。您正在使用stop the world GC(可能是并行清除)。此异常是因为GC花费的时间太长,可能超过总执行时间的98%。在这种情况下,JVM会终止进程,因为没有真正的工作正在进行 解决办法可以是:
-XX:-usegcoveredlimit
忽略此GC时间限制,这可能会导致问题,因为JVM一直在GC上工作而不是实际工作李>
-XX:+heapdumponootfmemoryerror
转储内存跟踪并分析跟踪您正在使用stop the world GC(可能是并行清除)。此异常是因为GC花费的时间太长,可能超过总执行时间的98%。在这种情况下,JVM会终止进程,因为没有真正的工作正在进行 解决办法可以是:
-XX:-usegcoveredlimit
忽略此GC时间限制,这可能会导致问题,因为JVM一直在GC上工作而不是实际工作李>
-XX:+heapdumponootfmemoryerror
转储内存跟踪并分析跟踪您是否尝试过使用
-XX:+HeapDumpOnOutOfMemoryError运行,然后检查转储文件?我有一个转储文件,但实际上我不知道要搜索什么。Hm。。。例如,对于一个您不期望的类,对象实例的数量异常多。但您还可以做一些事情:在OutOfMemoryError
上放置一个异常。现在,当OOM发生时,您不仅拥有相关的堆栈跟踪,而且可以在出现故障时实际使用调试器检查输入参数等。您是否对10:12左右的线程数爆炸有解释?没有。它可能是异常后JVisualVM Eclipse连接的某个工件,也可能是未知的。但它肯定是在Eclipse注意到异常后发生的。您是否尝试过使用-XX:+HeapDumpOnOutOfMemoryError运行,然后检查转储文件?我有一个转储文件,但实际上我不知道要搜索什么。嗯。。。例如,对于一个您不期望的类,对象实例的数量异常多。但您还可以做一些事情:在OutOfMemoryError
上放置一个异常。现在,当OOM发生时,您不仅拥有相关的堆栈跟踪,而且可以在出现故障时实际使用调试器检查输入参数等。您是否对10:12左右的线程数爆炸有解释?没有。它可能是异常后JVisualVM Eclipse连接的某个工件,也可能是未知的。但它肯定是在Eclipse注意到异常之后发生的。