垃圾收集器的解释-分配失败

时间:2018-08-26 19:04:41

标签: java garbage-collection garbage

我目前正在调查Minecraft(original post)游戏中的性能错误。我需要检查的最后一件事是垃圾收集器的输出。当我这样做时,我注意到所有输出的99%是[GC (Allocation Failure)....,这是输出的一小部分样本:

13.238: [GC (Allocation Failure)  805728K->167001K(1601024K), 0.0251328 secs]
13.907: [GC (Allocation Failure)  805977K->167208K(1618432K), 0.0257168 secs]
14.559: [GC (Allocation Failure)  802088K->167520K(1597440K), 0.0262393 secs]
15.257: [GC (Allocation Failure)  802400K->168597K(1622016K), 0.0281692 secs]
15.925: [GC (Allocation Failure)  805525K->170531K(1618944K), 0.0202619 secs]
27.474: [GC (Allocation Failure)  807459K->178239K(1626624K), 0.0239986 secs]
27.884: [GC (System.gc())  215249K->179128K(1624576K), 0.0286153 secs]
27.913: [Full GC (System.gc())  179128K->167443K(1624576K), 0.4367059 secs]

这到底是什么意思?我发现一个another post在谈论它,但是我不太明白它们的含义。有人可以用“婴儿语言”向我解释吗?

1 个答案:

答案 0 :(得分:1)

有问题建议我会尝试用婴儿语言改写对Java GC (Allocation Failure)的回答。

JVM总是在堆中维护大量空闲内存以用于新分配。

通常,当您执行new Something()时,一部分内存将从该空闲内存块中剔除。那是正常分配。

尽管如此,最终空闲的块已耗尽,并且下一次尝试破坏某些内存的尝试将失败-allocation failure

这是垃圾收集开始运行的信号。垃圾收集会发挥其魔力,发现死亡的对象,将回收的内存压缩为较大的空闲块,然后继续循环。

换句话说,allocation failure-对于JVM来说是完全正常的情况。

实际上,情况稍微复杂一些。堆有两个部分(年轻空间和旧空间),线程本地分配缓冲区等。