Каков размер сохраненного файла java.lang.Integer?
Я использую Java Hotspot 1.8.0_191-b12 (64 бита, Xmx < 32 ГБ) и смотрю дамп jmap (формат hprof) с различными инструментами.
Отчеты VisualVM (и инструменты на основе профилировщика NetBeans) сильно отличаются от Yourkit и Eclipse Memory Analyzer.
Я посмотрел на самые простые объекты, и даже они отличаются... для java.lang.Integer VisualVm сообщает о 20 байтах вместо 16 как о других (что в моей интерпретации объясняется тем, что = 12 байтов заголовка + 4 байта int 'value'подано из класса Integer = 16, заполнение не требуется).
Какой из них правильный и почему?
1 ответ
Единственный правильный инструмент - это JOL, все остальные могут быть неточными.
И это сообщает 16 bytes
: 12 для заголовков + 4 для int
сам (так что вы правы).
Integer i = 42;
System.out.println(ClassLayout.parseInstance(i).toPrintable());
Я оставляю это вам, чтобы запустить этот код и посмотреть вывод самостоятельно. Просто обратите внимание, что это могло бы быть больше, если UseCompressedOops
был бы отключен; в таком случае будет дополнительный 4 bytes
+ дополнительно 4 bytes
для набивки.