java.lang.OutOfMemoryError超出Java堆空间的GC开销限制?

java.lang.OutOfMemoryError: Java堆空间的含义

该消息意味着应用程序只需要比可用的Java堆空间更多的Java堆空间来正常运行.

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

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

所以这是我的理解,当基于场景抛出特定异常时: –

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

1)JVM开始分配内存,然后在一个时间点耗尽1GB内存并抛出java.lang.OutOfMemoryError:Java堆空间

2)GC提前运行并尝试释放一些内存,因为它知道当前正在使用的内存接近1 GB分配,Heap.但它不能释放超过2%的空间
后续运行.然后它会抛出java.lang.OutOfMemoryError:超出GC开销限制

我的理解在我的问题中是否正确?

最佳答案

OutOfMemoryError: Java heap space

即使在执行了所有最后沟渠工作之后,JVM也无法满足分配请求.

OutOfMemoryError GC overhead limit exceeded

意味着JVM可能能够满足分配请求,但是在最近的过去,它经常需要GC,因此在GCing上花费的CPU时间超过了Java进程使用的总CPU时间的(可配置的)部分.

JVM自我终止,而不是挥之不去的半工作,非常低效的状态,可能只会随着时间的推移而变得更糟.

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

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

点赞