垃圾收集器的解释 - 分配失败
explanation for Garbage Collector - Allocation Failure
我目前正在调查游戏 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]
这到底是什么意思?我发现一个 正在谈论它,但我不太明白他们的意思。谁能在 'baby language' 给我解释一下?
根据问题的建议,我会尝试用婴儿语言改写 的答案。
JVM 始终在堆中维护大块空闲内存用于新分配。
通常,当您执行 new Something()
时,一部分内存会从该空闲内存块中切掉。那是正常分配。
不过,最终空闲块用完了,下一次尝试占用一些内存会失败 - allocation failure
。
这是垃圾收集启动的信号。垃圾收集发挥它的魔力,找到死对象,将回收的内存压缩成大的空闲块,然后循环继续。
换句话说 allocation failure
- 对于 JVM 来说是完全正常的情况。
实际上,事情稍微复杂一些。堆有两部分(新旧空间),线程本地分配缓冲区等
我目前正在调查游戏 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]
这到底是什么意思?我发现一个
根据问题的建议,我会尝试用婴儿语言改写
JVM 始终在堆中维护大块空闲内存用于新分配。
通常,当您执行 new Something()
时,一部分内存会从该空闲内存块中切掉。那是正常分配。
不过,最终空闲块用完了,下一次尝试占用一些内存会失败 - allocation failure
。
这是垃圾收集启动的信号。垃圾收集发挥它的魔力,找到死对象,将回收的内存压缩成大的空闲块,然后循环继续。
换句话说 allocation failure
- 对于 JVM 来说是完全正常的情况。
实际上,事情稍微复杂一些。堆有两部分(新旧空间),线程本地分配缓冲区等