Я хотел бы спросить о накладных расходах памяти в Java,
У меня большой ArrayList (61 770 элементов), и я пытаюсь рассчитать объем памяти, занимаемый каждым элементом (считая объект и его запись ArrayList),
Профилируя приложение, я получаю, что после загрузки всех данных, куча занимает ~ 25 МБ.
когда ArrayList имеет только 2 элемента, куча занимает ~ 1Mb, примерно так:
(24 *1024* 1024) / 61 768 = 407 байт.
однако , когда я подсчитываю поля каждого объекта, я получаю 148 байт (не считая ArrayList и предполагая, что int = 4, float = 4, reference = 4), мне любопытно знать, откуда взялись все эти дополнительные байты ...
Я могу предположить, что, поскольку объекты, которые я храню в ArrayList, реализуют интерфейс, они хранят дополнительные значения, может быть, виртуальная машина хранит 4-байтовый указатель на функцию для каждого реализованного метода?
Интерфейс, который они реализуют, имеет 20 функций, так что на 80 байтов больше, всего 228 байтов, все еще не близко к 400 измеренным байтам.
любая помощь будет оценена.
Ух, спасибо за все великолепные ответы.
@ Боло: спасибо за ссылку, с этим классом я измеряю ~ 350 байт на объект, поэтому я меньше всего могу подтвердить источник большого использования памяти.
@ Yuval A: спасибо за эту презентацию, ценный источник информации.
@ Укко: точка отмечена.
@ Jayan: прямо сейчас профилировщик NetBeans выдает мне ошибки, когда я пытаюсь сбросить кучу, попробую позже.