java.lang.OutOfMemoryError GC开销限制超过了Java堆空间?

M S*_*ach 6 java heap garbage-collection

java.lang.OutOfMemoryError:Java堆空间的含义 该消息表示应用程序仅需要比其正常运行所需的Java堆空间更多的空间。

java.lang.OutOfMemoryError:超出GC开销限制的意思是 此消息表示由于某种原因,垃圾收集器占用过多的时间(默认情况下为该进程所有CPU时间的98%),并且每次运行都恢复很少的内存(默认情况下为堆的2%)。在内部,这还意味着当应用程序仅需要比其正常运行可用的Java堆空间更多的空间时。

所以我的问题是以上两种情况中的哪一种会被触发?

所以这是我的理解,何时会根据情况抛出特定的异常:

假设我分配了1GB的堆大小。当前正在使用的堆内存为970 MB。一个线程启动了(JVM不预先知道它将消耗多少内存)。现在,GC可以采取以下步骤之一

1)JVM开始分配内存,然后在某一时间耗尽1GB的内存并抛出 java.lang.OutOfMemoryError: Java heap space

2)GC会提前运行,并尝试释放一些内存,因为它知道当前正在使用的内存已接近1 GB分配的堆。但是在随后的每次运行中,它不能释放超过2%的空间。然后它会抛出java.lang.OutOfMemoryError: GC overhead limit exceeded

在我的问题中我的理解正确吗?

the*_*472 2

OutOfMemoryError:Java 堆空间

即使在执行了所有最后的努力之后,JVM 也无法满足分配请求。

OutOfMemoryError 超出 GC 开销限制

意味着 JVM 可能能够满足分配请求,但最近它必须频繁进行 GC,以致于 GC 所花费的 CPU 时间超过了 java 进程使用的总 CPU 时间的(可配置的)一小部分。

JVM 会自行终止,而不是徘徊在半工作、高度低效的状态,这种状态随着时间的推移可能只会变得更糟。

通常,禁用 GC 开销 OOM 只会在几分钟后导致 Java 堆空间 OOM。

它基本上是一种快速失败机制。