java.lang.Integer 保留大小是多少?

What is the java.lang.Integer retained size?

我正在使用 Java Hotspot 1.8。0_191-b12(64 位,Xmx < 32 GB),我正在使用各种工具查看 jmap 转储(hprof 格式)。

VisualVM(和基于 NetBeans 分析器的工具)报告与 Yourkit 和 Eclipse 内存分析器有很大不同。

我查看了最简单的 objects,甚至那些也不同...对于 java.lang.Integer,VisualVm 报告 20 个字节,而不是其他的 16 个字节(在我的解释中是因为 = 12 字节 header + 4 字节 int 'value' 从整数 class = 16 归档,不需要填充)。

哪一个是正确的,为什么?

唯一正确使用的工具是 JOL,所有其他工具可能都不准确。

报告 16 bytes :headers 12 + int 本身 4(所以你是对的)。

  Integer i = 42;

  System.out.println(ClassLayout.parseInstance(i).toPrintable());

我将 运行 这段代码留给你自己看输出。请注意,如果 UseCompressedOops 被禁用,它可能会更多;在这种情况下,会有一个额外的 4 bytes + 额外的 4 bytes 用于填充。