Сколько памяти использует объект Java, когда все его члены равны нулю?
Правильно ли предположить, что объект Java обрабатывает только 8 байтов для ссылки на объект, если все его члены установлены на null
, или почему-то члены класса уже используют пробел в экземпляре по какой-либо причине?
Другими словами, если у меня есть большая коллекция объектов, которые я хочу использовать в пространстве, могу ли я рассчитывать на то, что оставшиеся неиспользуемые элементы будут установлены на null
для уменьшения объема памяти?
Ответы
Ответ 1
Нет, вам нужно 4 или 8 байтов (в зависимости от того, является ли это 32 или 64-разрядной системой) для каждого нулевого значения, которое вы сохраняете в поле. Как бы объект знал, что его поле было нулевым, если в нем ничего не было, чтобы сказать это?
Ответ 2
Нет, null также является информацией и также должен быть сохранен.
Ответ 3
Сами ссылки на объекты по-прежнему будут занимать некоторую память, поэтому единственная реальная экономия памяти будет связана с объектами кучи, которые были бы упомянуты.
Итак, если у вас
MyClass {
public Object obj;
MyClass(Object o) { obj = o; }
}
MyClass a = new MyClass( new HashMap() );
MyClass b = new MyClass( null );
оба объекта a
и b
сами занимают одинаковый объем памяти (оба они содержат одну ссылку), но объект obj
, на который указывает a
, занимает память в куче, поэтому это память могла быть сохранена путем установки ссылки на нуль.
Ответ 4
Спецификация Java Language и Спецификация виртуальной машины Java ничего не говорят о размере объектов Java в памяти - это намеренно осталось undefined, потому что это зависит от реализации JVM. Это означает, что вы не можете делать какие-либо предположения о том, сколько памяти использует объект Java вообще или что такое макет памяти объекта Java в памяти.
Как уже говорили другие: ссылка (переменная) занимает память, независимо от того, является ли эта ссылка null
или нет. Ваши объекты не будут уменьшаться и занимать меньше памяти, если вы установите переменные-члены на null
.
Ответ 5
Как насчет имен классов, объектов и методов? Как вы можете позвонить, получить доступ или создать экземпляр с помощью Java-отражения, имена также должны быть сохранены, верно? Но CMIIW.
кагэ
Ответ 6
Когда объект Java имеет все его члены, он равен нулю, тогда он будет потреблять память, потому что
Он также имеет некоторые дополнительные требования к памяти для заголовков, ссылок и ведения домашнего хозяйства.
Память кучи, используемая объектом Java, включает
-
память для примитивных полей, в зависимости от их размера.
-
память для ссылочных полей (по 4 байта).
-
заголовок объекта, состоящий из нескольких байтов "служебной" информации.
Объекты в java также требуют некоторой "служебной" информации, такой как запись классов объектов, идентификаторов и флагов состояния, таких как доступность объекта в настоящее время, в настоящее время синхронизация и т.д.
Размер заголовка объекта Java варьируется от 32 и 64 бит jvm.
Хотя это основные потребители памяти, jvm также требует дополнительных полей, иногда похожих на выравнивание кода e.t.c.
Так вот почему ваш Java-объект имеет все его члены, равные нулю, а затем он будет потреблять память.