Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 超出了GC开销限制,但内存不足_Java_Garbage Collection - Fatal编程技术网

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会终止进程,因为没有真正的工作正在进行

解决办法可以是:

  • 尝试另一种类型的GC,例如并发标记扫描,这不是停止世界GC
  • 尝试更大的内存,这样GC就不会那么频繁
  • 通过使用
    -XX:-usegcoveredlimit
    忽略此GC时间限制,这可能会导致问题,因为JVM一直在GC上工作而不是实际工作
  • 如上所述,使用
    -XX:+heapdumponootfmemoryerror
    转储内存跟踪并分析跟踪
  • 对堆未满但GC超出限制的原因进行更多的解释(所有这些都是猜测,需要更多的跟踪来确定原因): 这可能是

  • 太小的年轻一代或大多数对象从较小的GC中存活下来,因此GC发生得太频繁和/或花费很长时间移动对象(这可能通过更改堆上的年轻一代大小或通过某些JVM标志更改对象保留率来调整)
  • 旧代太小,从次要GC中幸存下来的对象无法适应旧代,这导致频繁的主要GC(或完全堆GC)
    您正在使用stop the world GC(可能是并行清除)。此异常是因为GC花费的时间太长,可能超过总执行时间的98%。在这种情况下,JVM会终止进程,因为没有真正的工作正在进行

    解决办法可以是:

  • 尝试另一种类型的GC,例如并发标记扫描,这不是停止世界GC
  • 尝试更大的内存,这样GC就不会那么频繁
  • 通过使用
    -XX:-usegcoveredlimit
    忽略此GC时间限制,这可能会导致问题,因为JVM一直在GC上工作而不是实际工作
  • 如上所述,使用
    -XX:+heapdumponootfmemoryerror
    转储内存跟踪并分析跟踪
  • 对堆未满但GC超出限制的原因进行更多的解释(所有这些都是猜测,需要更多的跟踪来确定原因): 这可能是

  • 太小的年轻一代或大多数对象从较小的GC中存活下来,因此GC发生得太频繁和/或花费很长时间移动对象(这可能通过更改堆上的年轻一代大小或通过某些JVM标志更改对象保留率来调整)
  • 旧代太小,从次要GC中幸存下来的对象无法适应旧代,这导致频繁的主要GC(或完全堆GC)
    您是否尝试过使用
    -XX:+HeapDumpOnOutOfMemoryError运行,然后检查转储文件?我有一个转储文件,但实际上我不知道要搜索什么。Hm。。。例如,对于一个您不期望的类,对象实例的数量异常多。但您还可以做一些事情:在
    OutOfMemoryError
    上放置一个异常。现在,当OOM发生时,您不仅拥有相关的堆栈跟踪,而且可以在出现故障时实际使用调试器检查输入参数等。您是否对10:12左右的线程数爆炸有解释?没有。它可能是异常后JVisualVM Eclipse连接的某个工件,也可能是未知的。但它肯定是在Eclipse注意到异常后发生的。您是否尝试过使用
    -XX:+HeapDumpOnOutOfMemoryError运行,然后检查转储文件?我有一个转储文件,但实际上我不知道要搜索什么。嗯。。。例如,对于一个您不期望的类,对象实例的数量异常多。但您还可以做一些事情:在
    OutOfMemoryError
    上放置一个异常。现在,当OOM发生时,您不仅拥有相关的堆栈跟踪,而且可以在出现故障时实际使用调试器检查输入参数等。您是否对10:12左右的线程数爆炸有解释?没有。它可能是异常后JVisualVM Eclipse连接的某个工件,也可能是未知的。但它肯定是在Eclipse注意到异常之后发生的。