Java - требует ли нулевая переменная места в памяти
class CheckStore {
private String displayText;
private boolean state;
private String meaningfulText;
private URL url;
public CheckStore(String text, boolean state) {
this.displayText = text;
this.state = state;
}
:
:
}
поскольку я инициализирую только две переменные (displayText и state) в конструкторе будут остальные две переменные (meaningfulText и url что будет иметь значение null) потребуется место в памяти для хранения null значение.
Q1. Я думаю, что они потребуют места. Если они будут, то это как null значение принимает в памяти (например int занимает 4 байта).
Q2. Сколько места занимает строка в памяти. Я думаю, это будет зависеть от длина строки. Итак, сколько места занимает строка какой длины?
4 ответов:
В Java,
null- Это просто значение, которое может иметь ссылка (которая в основном является ограниченным указателем). Это означает, что ссылка ни на что не ссылается. В этом случае вы все еще потребляете пространство для ссылки. Это 4 байта на 32-разрядных системах или 8 байт на 64-разрядных системах. Однако вы не потребляете никакого пространства для класса, на который указывает ссылка, пока вы фактически не Выделите экземпляр этого класса для указания ссылки.редактировать: насколько строка, а
Stringв Java занимает 16 бит (2 байта) для каждого символа, плюс небольшое количество бухгалтерских накладных расходов, которые, вероятно, недокументированы и специфичны для реализации.
Я хотел бы добавить:
- переменная ссылочного типа будет инициализирована как нулевое значение.
- null не является объектом. потому что (null instanceof Object) равно false
в JVM есть только одно нулевое значение. Независимо от того, сколько переменных приведена к нулю.
объект s = (строка)null;
объект i = (целое число)null;
можно использовать jol получить макет этого класса. (Однако будьте осторожны, вам может понадобиться более глубокое понимание механики за ним, не слепо доверяйте результату и знайте, что это всего лишь оценка для используемой в настоящее время виртуальной машины (1.7.0_76 x64 win в моем случае:):
Я использую версию CLI я предполагаю, что правильный метод будет включать библиотеку в ваш проект, но в любом случае, это, кажется, работает следующим образом:
test>java -cp target\classes;jol-cli-0.3.1-full.jar org.openjdk.jol.Main internals test.CheckStore Running 64-bit HotSpot VM. Using compressed oop with 0-bit shift. Using compressed klass with 0-bit shift. Objects are 8 bytes aligned. Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes] Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes] VM fails to invoke the default constructor, falling back to class-only introspection. test.CheckStore object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 12 (object header) N/A 12 1 boolean CheckStore.state N/A 13 3 (alignment/padding gap) N/A 16 4 String CheckStore.displayText N/A 20 4 String CheckStore.meaningfulText N/A 24 4 URL CheckStore.url N/A 28 4 (loss due to the next object alignment) Instance size: 32 bytes (estimated, the sample instance is not available) Space losses: 3 bytes internal + 4 bytes external = 7 bytes totalи то же с автоматическим сжатием ой выкл:
test>java -XX:-UseCompressedOops -cp target\classes;jol-cli-0.3.1-full.jar org.openjdk.jol.Main internals test.CheckStore Running 64-bit HotSpot VM. Objects are 8 bytes aligned. Field sizes by type: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes] Array element sizes: 8, 1, 1, 2, 2, 4, 4, 8, 8 [bytes] VM fails to invoke the default constructor, falling back to class-only introspection. test.CheckStore object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 16 (object header) N/A 16 1 boolean CheckStore.state N/A 17 7 (alignment/padding gap) N/A 24 8 String CheckStore.displayText N/A 32 8 String CheckStore.meaningfulText N/A 40 8 URL CheckStore.url N/A Instance size: 48 bytes (estimated, the sample instance is not available) Space losses: 7 bytes internal + 0 bytes external = 7 bytes totalэто только макеты для самого объекта, если ваши поля равны нулю, то он не будет указывать на другие объекты, иначе вам придется смотреть на целевые типы (
URLиString), а также. (И если у вас есть несколько экземпляров всех из них, это зависит от того, используете ли вы один и тот же несколько раз или разные). Нулевое поле не может быть пропущено в памяти, так как это потребует изменения размера экземпляра при его назначении. Так что поля все они предварительно построены, они просто не ссылаются на выделенные объекты где-то еще в куче.NB: вы получите более подробную информацию, если вы реализуете конструктор по умолчанию, но размер в этом конкретном случае будет одинаковым. Если вам интересно, откуда берется последовательность и заполнение полей, вы можете проверить в этой статье - (в основном он выравнивает объекты на 8 байт, сортирует поля по размеру, группирует однотипные вместе, ссылки последние. Поля из супер типов являются во-первых, 4 байтовое выравнивание.)
Null означает 0. Там, как правило, одно место, нуль, определенными в памяти. Всякий раз, когда на него указывают с помощью языка программирования. Все указывает на одно и то же место. Это означает, что для NULL используется только одна 4-байтовая память. Тогда все, что указывает на это, больше не потребляет памяти. Определение NULL является специфичным для языка, но определение его void *ptr=0; распространено в C и c++. JAVA должен был определить его аналогично. Нельзя ни на что указывать ОФК. Вы должны на что-то указать. Но мы определяем общее ничто и все указывает на то, что оно потребляет только это пространство.
Comments