'OutOfMemoryError':通常,当没有足够的空间来分配Java堆中的对象时,会抛出此错误。
GC(分配失败):分配失败“意味着分配请求大于年轻代中的可用空间。
这是否意味着当Young Generation内存已满(Minor GC)并且在完整GC中抛出“OutOfMemoryError”时,将抛出分配失败?
据我所知,这些可能会变得相关;但它们完全不同。
OutOfMemory
是一个你无法恢复的错误 - JVM将在此时死亡。
GC (Allocation Failure): Allocation Failure
是GC推出的原因(并进行次要收集)。在这一点上可能会发生一些事情,例如:为新的分配释放足够的空间以适应young generation
。或者那没有发生,一些对象将被提升为old generation
。如果他们can't be promoted
,可能会触发full GC
- 如果这不能释放足够的空间,可能会抛出OutOfMemory
。
通常,当您已经超过已分配给JVM的最大内存时,会发生OutOfMemoryError
。使用jvm参数启动java时可以更改此数量。例如-Xmx2G
。请注意,此金额不会立即使用。见下文。
GC(分配失败)是类似的,除了它发生在垃圾收集器堆上的内存不足时,它会尝试分配更多。如果分配的内存高于可用的系统内存,则会失败。本质上,JVM尝试分配不存在的内存。
分配(疏散)失败
与CMS一样,G1收集器在应用程序继续运行时运行其集合的一部分,并且存在应用程序分配对象的速度快于垃圾收集器可以恢复可用空间的风险。有关类似的CMS行为,请参阅并发标记扫描(CMS)收集器中的并发模式失败部分。在G1中,G1正在将实时数据从一个区域(撤离)复制到另一个区域时发生故障(Java堆的耗尽)。进行复制以压缩实时数据。如果在撤离被垃圾收集的区域期间无法找到空闲(空)区域,则会发生分配失败(因为没有空间来分配来自撤离区域的活动对象)和停止世界( STW)完整收藏完成。