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