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

548   4  

4 ответов:

В Java, null - Это просто значение, которое может иметь ссылка (которая в основном является ограниченным указателем). Это означает, что ссылка ни на что не ссылается. В этом случае вы все еще потребляете пространство для ссылки. Это 4 байта на 32-разрядных системах или 8 байт на 64-разрядных системах. Однако вы не потребляете никакого пространства для класса, на который указывает ссылка, пока вы фактически не Выделите экземпляр этого класса для указания ссылки.

редактировать: насколько строка, а String в Java занимает 16 бит (2 байта) для каждого символа, плюс небольшое количество бухгалтерских накладных расходов, которые, вероятно, недокументированы и специфичны для реализации.

Я хотел бы добавить:

  1. переменная ссылочного типа будет инициализирована как нулевое значение.
  2. null не является объектом. потому что (null instanceof Object) равно false
  3. в 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

    Ничего не найдено.