Каков размер сохраненного файла 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 для набивки.

Другие вопросы по тегам