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

时间:2019-01-14 14:00:00

标签: java visualvm jvisualvm yourkit memory-footprint

我正在使用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,无需填充)。

哪个是正确的,为什么?

1 个答案:

答案 0 :(得分:3)

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

然后报告16 bytes:标题为12,int本身为4(所以您是对的)。

  Integer i = 42;

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

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