javavisualvmjvisualvmyourkitmemory-footprint

What is the java.lang.Integer retained size?


I'm using Java Hotspot 1.8.0_191-b12 (64 bit, Xmx < 32 GB) and I'm looking at a jmap dump (hprof format) with various tools.

VisualVM (and NetBeans profiler based tools) reports differ a lot from Yourkit and Eclipse Memory Analyzer.

I looked at the most simple objects, and even those differ... for java.lang.Integer, VisualVm reports 20 bytes, instead of 16 as the others (that in my interpretation is because = 12 bytes header + 4 bytes int 'value' filed from the Integer class = 16, no padding needed).

Which one is correct and why?


Solution

  • The only correct tool to use is JOL, all others might be inaccurate.

    And that reports 16 bytes : 12 for headers + 4 for int itself (so you are correct).

      Integer i = 42;
    
      System.out.println(ClassLayout.parseInstance(i).toPrintable());
    

    I am leaving it to you to run this code and see the output yourself. Just notice that it could have been more, if UseCompressedOops would have been disabled; in such a case there would be an extra 4 bytes + extra 4 bytes for padding.