Сколько памяти использует объект 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-объект имеет все его члены, равные нулю, а затем он будет потреблять память.