Java 垃圾收集器-分配失败的说明
我目前正在调查游戏Minecraft()中的一个性能缺陷。我最不需要检查的是垃圾收集器的输出。当我这样做时,我注意到99%的输出是Java 垃圾收集器-分配失败的说明,java,garbage-collection,garbage,Java,Garbage Collection,Garbage,我目前正在调查游戏Minecraft()中的一个性能缺陷。我最不需要检查的是垃圾收集器的输出。当我这样做时,我注意到99%的输出是[GC(分配失败)…以下是输出的一个小样本: 13.238: [GC (Allocation Failure) 805728K->167001K(1601024K), 0.0251328 secs] 13.907: [GC (Allocation Failure) 805977K->167208K(1618432K), 0.0257168 secs]
[GC(分配失败)…
以下是输出的一个小样本:
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总是在堆中为新的分配维护大量可用内存 通常,当您执行
newsomething()
时,一部分内存会从空闲内存块中被削掉。这是正常的分配
不过,最终空闲块耗尽了,下一次尝试切取一些内存将失败-分配失败
这是垃圾收集开始的信号。垃圾收集发挥它的魔力,找到死对象,将回收的内存压缩成大的空闲块,循环继续
换句话说,分配失败
——对于JVM来说是完全正常的情况
实际上,事情稍微复杂一些。堆有两个部分(年轻的和旧的空间)、线程本地分配缓冲区等。正如问题所示,我会尝试用婴儿语言重新表述答案 JVM总是在堆中为新的分配维护大量可用内存 通常,当您执行
newsomething()
时,一部分内存会从空闲内存块中被削掉。这是正常的分配
不过,最终空闲块耗尽了,下一次尝试切取一些内存将失败-分配失败
这是垃圾收集开始的信号。垃圾收集发挥它的魔力,找到死对象,将回收的内存压缩成大的空闲块,循环继续
换句话说,分配失败
——对于JVM来说是完全正常的情况
实际上,事情稍微复杂一些。堆有两部分(年轻空间和旧空间)、线程本地分配缓冲区等。Ah,因此分配失败基本上是“当前选定的内存部分不可用”的可怕措辞,导致警告。
[Full GC(System.GC())
只是清除所有内存。@SanderKoldenhof不例外。GC应该定期工作。“分配失败”是启动下一个正常GC循环(通常是小GC)的正常原因。另一方面,“完全GC”通常被认为是坏事(冻结JVM数秒)。System.GC()将强制始终强制“完全GC”.Ah,所以分配失败基本上是“当前选定的内存部分不可用”的一个可怕的说法,导致了警告。[Full GC(System.GC())
只是清除所有内存。@SanderKoldenhof不例外。GC应该定期工作。“分配失败”是启动下一个正常GC周期的正常原因另一方面,“完全GC”通常被认为是一件坏事(将JVM冻结几秒钟)。System.GC()将强制始终执行“完全GC”。