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
用于填充。
我正在使用 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
用于填充。