我正在使用Java Hotspot 1.8.0_191-b12(64位,Xmx<32 GB),我正在寻找带有各种工具的jmap转储(hprof格式)。
VisualVM(和基于 NetBeans 探查器的工具)报告与 Yourkit 和 Eclipse Memory Analyzer 有很大不同。
我看了最简单的物体,甚至那些不同的......对于java.lang.Integer,VisualVm报告20个字节,而不是其他的16个字节(在我的解释中,这是因为= 12字节的标头+ 4字节int 'value'从Integer类= 16归档,不需要填充)。
哪一个是正确的,为什么?
唯一正确的工具是JOL,所有其他工具可能都不准确。
报告16 bytes
:标题为 12 + int
本身为 4(所以你是对的)。
Integer i = 42;
System.out.println(ClassLayout.parseInstance(i).toPrintable());
我把它留给你运行这段代码并自己查看输出。请注意,如果禁用UseCompressedOops
它可能会更多;在这种情况下,将有一个额外的4 bytes
+ 额外的填充4 bytes
。