Я хотел бы спросить о Memory Overhead в java, У меня есть большой ArrayList (61,770 пунктов) и пытается рассчитать объем памяти, сделанный каждым элементом (считая объект и его запись ArrayList) , профилируя приложение, я получаю, что после загрузки всех данных куча занимает ~ 25 Мб. , когда ArrayList имеет только 2 элемента, куча принимает ~ 1Mb, поэтому примерно:Накладные расходы памяти Java
(24 * 1024 * 1024)/61,768 = 407 байт.
однако, когда я сосчитать полей каждого объекта, я получаю 148 байт (не включая ArrayList, и предполагая, междунар = 4, поплавок = 4, задание = 4), мне интересно знать, где сделал все эти дополнительные байты исходили из ...
Я могу догадаться, что, поскольку объекты, которые я храню в ArrayList, реализуют интерфейс, они хранят дополнительные значения, возможно, VM хранит 4-байтовый указатель функции для каждого реализованного метода? интерфейс, который они реализуют, имеет 20 функций, так что 80 байтов на общую сумму 228 байт, все еще не близкие к 400 байтам.
любая помощь будет оценена.
Вау, спасибо за все замечательные ответы.
@Bolo: спасибо за ссылку, этот класс i измеряет ~ 350 байт на объект, поэтому я могу в наименьшей степени подтвердить источник использования большой памяти.
@Yuval A: Благодарю вас за эту презентацию, ценный источник информации.
@Ukko: указанный пункт.
@Jayan: прямо сейчас профилировщик NetBeans дает мне ошибки, когда я пытаюсь сбросить кучу, попробую позже.
Эта статья может быть вам полезна: http://www.javaworld.com/javaworld/javatips/jw-javatip130.html – Bolo
Если вы начинаете с нового ArrayList (61770) вместо, например, нового ArrayList (), а затем пусть это автоматически изменится, вы также получите разные накладные расходы. Вы установили правильный размер перед проверкой использования памяти? – extraneon
@flamealpha: 61 770 невелик :) У меня есть HashMap настолько большой, что они приносят большинство систем на колени ... Вот почему я заменил их на * TIntIntHashMap от Trove *, которые просто * так * намного больше памяти/скорость-эффективность :) Увы, он работает только с примитивами: -/ –
SyntaxT3rr0r