Сколько памяти использует объект Java, когда все его члены равны нулю? - PullRequest
13 голосов
/ 18 сентября 2009

Правильно ли предположить, что объект Java занимает только 8 байтов для ссылки на объект, если все его члены установлены на null или определение членов уже использует пространство в экземпляре по какой-то причине?

Другими словами, если у меня есть большая коллекция объектов, которые я хочу использовать для экономии места, могу ли я рассчитывать на то, что для неиспользуемых элементов будет установлено значение null для уменьшения объема памяти?

Ответы [ 6 ]

17 голосов
/ 18 сентября 2009

Нет, вам нужно 4 или 8 байтов (в зависимости от того, является ли это 32- или 64-битной системой) для каждого нулевого значения, которое вы храните в поле. Как бы объект узнал, что его поле было пустым, если где-то не сохранено что-либо, чтобы сказать это?

6 голосов
/ 18 сентября 2009

Нет, ноль также является информацией и также должен быть сохранен.

1 голос
/ 18 сентября 2009

Спецификация языка Java и Спецификация виртуальной машины Java ничего не говорят о размере объектов Java в памяти - это намеренно оставлено неопределенным, поскольку зависит от реализации JVM. Это означает, что вы не можете делать какие-либо предположения о том, сколько памяти использует объект Java в целом или какова структура памяти объекта Java в памяти.

Как уже говорили другие: ссылка (переменная) занимает память, независимо от того, является ли ссылка null или нет. Ваши объекты не будут уменьшаться и занимать меньше памяти, если вы установите переменные-члены на null.

1 голос
/ 18 сентября 2009

Сами ссылки на объекты по-прежнему будут занимать некоторую память, поэтому единственная реальная экономия памяти будет за счет объектов кучи, на которые были бы ссылки.

Итак, если у вас есть

MyClass {
    public Object obj;
    MyClass(Object o) { obj = o; }
}

MyClass a = new MyClass( new HashMap() );
MyClass b = new MyClass( null );

два объекта a и b сами занимают одинаковый объем памяти (они оба содержат одну ссылку), но объект obj, на который ссылается a, занимает память в куче, так что память можно было бы сохранить, установив ссылку на ноль.

0 голосов
/ 18 мая 2013

Когда у объекта Java все его члены равны нулю, ему потребляется память, потому что Он также имеет некоторые дополнительные требования к памяти для заголовков, ссылок и ведения.

Память кучи, используемая объектом Java, включает

  • память для примитивных полей, в соответствии с их размером.

  • память для эталонных полей (4 байта каждое).

  • заголовок объекта, состоящий из нескольких байтов служебной информации.

Для объектов в java также требуется некоторая служебная информация, такая как запись класса объекта, идентификатора и флагов состояния, например, доступен ли объект в данный момент, заблокирован ли он в данный момент и т.д.

Размер заголовка объекта Java варьируется в 32- и 64-битных jvm.

Хотя это основные потребители памяти, jvm также требуются дополнительные поля, например, для выравнивания кода e.t.c.

Так что это причина того, что у вашего Java-объекта все его члены равны нулю, тогда он будет использовать память.

0 голосов
/ 18 сентября 2009

А как насчет имен классов, объектов и методов? Поскольку вы можете вызывать их, обращаться к ним или создавать их экземпляры с помощью Java Reflect, имена тоже должны где-то храниться, верно? Но CMIIW.

Kage

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...