Распределение памяти, объявляющее поле - PullRequest
1 голос
/ 30 июня 2011

Сколько памяти Java выделяет для объявления таких полей, как private char letter; и private int size; в момент создания объекта, содержащего эти поля?

Ответы [ 5 ]

4 голосов
/ 30 июня 2011

Это зависит от реализации виртуальной машины.Спецификация указывает, что тип примитива char имеет диапазон значений 16 бит, но он не определяет , как виртуальная машина должна хранить объект в куче.

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


ToОтветьте на ваше пояснение в комментарии: Опять же, это зависит от реализации, но есть несколько веских причин выделить память для всех атрибутов класса один раз во время «создания» объекта.Если бы мы решили отложенное выделение , то нам пришлось бы добавить механику для динамического изменения размеров объектов в куче во время выполнения, что довольно дорого.

Если мы зарезервируем все пространство сразу наНачнем с того, что нам никогда не придется изменять размер или перемещать данные в куче, потому что структуры данных никогда не могут увеличиваться или уменьшаться в размере.

3 голосов
/ 30 июня 2011

В JVM Oracle / Sun каждый объект размещается на 8-байтовой границе.Таким образом, добавление поля может не увеличить объем используемой памяти.Однако в качестве руководства здесь приведены размеры примитивов

type           typical size
byte, boolean  1 byte
char, short    2 bytes
int, float     4 bytes
long, double   8 bytes

Независимо от того, является ли JVM 32-битной или 64-битной, нет различий с размером примитива, но это меняет размер ссылки по умолчанию.

1 голос
/ 30 июня 2011

Это зависит от реализации.

Ранние реализации JVM были ближе к формату файла класса.В этом случае byte, short, char, int, float и ссылки занимают один слот;long и double два слота.Итак, эффективно округляем размер до четырех байтов, и это то, сколько памяти занимает объект.Затем общая сумма для объекта, включая заголовок, часто округляется до 8 байтов для лучшего выравнивания памяти.Для «сжатых операций» (32-битные ссылки на 64-битных платформах, где нижние биты 64-битного адреса всегда равны нулю, что позволяет смещать ссылку и использовать более 4 ГБ, сохраняя ссылки до четырех байтов),Сильное давление, чтобы выровнять большие размеры.

Но большую часть десятилетия у нас были 64-битные JVM.Это означает больше потерь, в том числе с точки зрения пропускной способности процессорной памяти.Поэтому в современных реализациях компоновка объекта сжимается так, что объект использует столько памяти, сколько вы ожидаете (плюс округление заголовка и выравнивания).

1 голос
/ 30 июня 2011

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

1 голос
/ 30 июня 2011

Я не знаю особенностей JVM, но если это поможет вам, примитивный тип char использует 16-битный (символ Unicode) для хранения данных, а int использует 32-битный

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Полагаю, вы могли бы проверить это, создав очень простое Java-приложение и очень простой объект. Запустите приложение, не объявляя поля, и проверьте, сколько памяти оно использует (Ctrl + Shift + Escape в Windows), а затем перезапустите и проверьте разницу при выделении этих полей.

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