我正在使用Java Hotspot 1.8.0_191-b12(64位,Xmx <32 GB),并且正在使用各种工具查看jmap转储(hprof格式)。
VisualVM(和基于NetBeans Profiler的工具)的报告与Yourkit和Eclipse Memory Analyzer有很大的不同。
我查看了最简单的对象,即使是不同的对象,对于java.lang.Integer,VisualVm也报告20个字节,而不是其他16个字节(在我的解释中,这是因为= 12个字节的标头+ 4个字节从Integer类提交的int'value'= 16,无需填充)。
哪个是正确的,为什么?
答案 0 :(得分:3)
唯一正确使用的工具是JOL,所有其他工具可能都不准确。
然后报告16 bytes
:标题为12,int
本身为4(所以您是对的)。
Integer i = 42;
System.out.println(ClassLayout.parseInstance(i).toPrintable());
我将它留给您来运行此代码并自己查看输出。请注意,如果UseCompressedOops
被禁用,则可能更多。在这种情况下,将会有额外的4 bytes
+额外的4 bytes
用于填充。