为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

小唯快跑啊 2021-08-13 16:10:24
我目前正在调查游戏 Minecraft 中的一个性能错误(原帖)。我需要检查的最后一件事是垃圾收集器的输出。当我这样做时,我注意到所有输出的 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]这到底是什么意思?我找到了另一篇谈论它的帖子,但我不太明白他们的意思。谁能用“婴儿语言”向我解释这一点?
查看完整描述

1 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

正如问题所暗示的那样,我会尝试用婴儿语言重新表述对Java GC(分配失败)的回答。

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

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

尽管如此,最终空闲块耗尽了,下次尝试对一些内存进行芯片化将失败 - allocation failure

这是垃圾收集开始的信号。垃圾收集发挥它的魔力,找到死对象,将回收的内存压缩成大的空闲块,然后循环继续。

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

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


查看完整回答
反对 回复 2021-08-13
  • 1 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信