Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 垃圾收集器-分配失败的说明_Java_Garbage Collection_Garbage - Fatal编程技术网

Java 垃圾收集器-分配失败的说明

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]

我目前正在调查游戏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]
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”。