【问题标题】:explanation for Garbage Collector - Allocation Failure垃圾收集器 - 分配失败的解释
【发布时间】:2019-02-01 09:47:25
【问题描述】:

我目前正在调查 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,但我不太明白它们的意思。谁能用“婴儿语言”向我解释一下?

【问题讨论】:

    标签: java garbage-collection garbage


    【解决方案1】:

    正如问题所暗示的那样,我会尝试用婴儿语言改写对Java GC (Allocation Failure) 的回答。

    JVM 总是在堆中为新分配维护大块空闲内存。

    通常,当您执行new Something() 时,会从该空闲内存块中切掉一部分内存。这是正常的分配。

    尽管如此,最终空闲块耗尽了,下一次尝试切入一些内存将会失败 - allocation failure

    这是垃圾收集启动的信号。垃圾收集发挥作用,找到死对象,将回收的内存压缩成大的空闲块并继续循环。

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

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

    【讨论】:

    • 啊,所以分配失败基本上是“当前选择的内存部分不可用”的可怕措辞,导致警告。 [Full GC (System.gc()) 只是清除所有内存。
    • @SanderKoldenhof 不是很清楚。 GC 应该定期工作。 “分配失败”是启动下一个正常 GC 周期(通常是次要 GC)的正常原因。另一方面,“Full GC”通常被认为是坏事(冻结 JVM 几秒钟)。 System.gc() 会强制总是强制“Full GC”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多