gpt4 book ai didi

java - 如何检查java堆是否碎片化?

转载 作者:行者123 更新时间:2023-11-30 07:40:51 25 4
gpt4 key购买 nike

我有一个 29G 的堆转储,它是在 OutOfMemoryError 发生后由 Hotspot VM 创建的。堆分析器(我使用 YourKit)显示所有对象(包括不可达)占用 26G。我的猜测是剩余的 3G 被浪费了,因为堆是碎片化的。有没有办法验证这个理论?

最佳答案

这与堆碎片无关。

大小的差异由堆转储格式解释。请注意,堆转储不是堆的原始内容 - 它是 HPROF 中内容的序列化表示。格式。

因此,每个对象实例都由具有以下结构的 HPROF_GC_INSTANCE_DUMP 记录表示:

u1   record tag
u8 object ID
u4 stack trace serial number
u8 class ID
u4 number of bytes that follow
u1* <field data>

考虑 java.lang.Integer 的一个实例。在 64 位压缩 OOPs HotSpot JVM 中,一个 Integer 的实例需要 16 个字节:8 个字节的 header + 4 个字节的类指针 + 4 个字节的 value 字段。同一个实例在堆转储中将占用 29 个字节,从而产生 81.25% 的巨大开销。

当然,典型 Java 应用程序中的堆通常充满了更大的对象,即数组。这就是为什么 HPROF 记录 header 的平均开销看起来更小,大约为 10%,就像您的情况一样。

关于java - 如何检查java堆是否碎片化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56905030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com