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