Размеры объектов в Java, или о чём нам врут heap dump'ы
(пост из серии «будни перформанс-инженеров»)Привет! Наблюдая достаточно много постов про занимаемое объектами пространство в Java, решил написать пост, срывающий покровы. Для понимания происходящего неплохо было бы ориентироваться в азах устройства Java heap'а, минимальных размерах базовых типов, продвинутых штук, типа сжатых указателей.
Часть первая. Мифы.
Миф 0. Можно раз и навсегда узнать, сколько будет занимать объект в памяти.
Реальность: Зависит как минимум от: а) целевой JVM, будь то HotSpot, JRockit, J9 или ещё что-нибудь; б) битности, как минимум размеры указателей могут различаться, а то и базовые типы могут быть представлены другими размерами (при поддержке семантики языка), в) включённых и случившихся оптимизаций, типа инлайна объектов, скаляризаций, паддингов, г) и ещё тучи всяких штук, по сравнению с которыми фазы Луны куда более предсказуемы.
Читать дальше →