GC(分配失败)VS OutOfMemoryError异常

use*_*119 7 java jvm java-8

'OutOfMemoryError':通常,当没有足够的空间来分配Java堆中的对象时,会抛出此错误.

GC(分配失败):分配失败"意味着分配请求大于年轻代中的可用空间.

这是否意味着当Young Generation内存已满(Minor GC)并且在完整GC中抛出"OutOfMemoryError"时,将抛出分配失败?

Eug*_*ene 7

据我所知,这些可能会变得相关; 但它们完全不同.

OutOfMemory 是一个无法恢复的错误 - JVM将在此时死亡.

GC (Allocation Failure): Allocation Failure这就是为什么GC会开始(并做一个小的收集)的原因.此时可能会发生一些事情,例如:释放足够的空间以使新分配适应young generation.或者没有发生,一些对象将被提升为old generation.如果can't be promoted一个full GC可能被触发-如果这不能释放足够的空间OutOfMemory 可能会被抛出.

  • *“OutOfMemory 是一个您无法从中恢复的错误”* - 这句话有点过于宽泛了。一些 OOME 实际上是可以合理恢复的。 (2认同)
  • @the8472实际上我想我找到了一个对我有意义的:http://stackoverflow.com/questions/2679330/捕捉-java-lang-outofmemoryerror/4745520#4745520。在某些情况下,还需要分配“连续”内存块...... (2认同)

kil*_*joy 3

通常,OutOfMemoryError当超出已分配给 JVM 的最大内存时,就会发生这种情况。使用 jvm 参数启动 java 时可以更改此数量。例如-Xmx2G。请注意,该金额不会立即使用。见下文。

GC(分配失败)类似,只不过它发生在垃圾收集器耗尽堆上的内存并尝试分配更多内存时。如果您分配的内存高于可用系统内存,则此操作将会失败。本质上,JVM 尝试分配不存在的内存。

请参阅了解更多信息