Скільки пам'яті займає посилання на Java

Скільки пам'яті займає посилання на Java



Java - Чи вимагає порожня змінна місця в пам'яті

Коли я ініціалізую дві змінні (displayText і state) у конструкторі, чи вимагають дві інші змінні (meaningfulText і url) місця в пам'яті для зберігання значення null? Запитання 1. Якщо вони потребують місця, скільки пам'яті займає значення null у пам'яті? (наприклад, int займає 4 байти). Запитання 2. Скільки місця займає рядок у пам'яті? Скільки місця займає рядок у пам'яті? Чи це залежить від довжини рядка? java

4 відповіді

У Java, null - це просто значення, яке може мати посилання (яка в основному є обмеженим покажчиком). Це означає, що посилання посилається нічого. У цьому випадку ви все ще витрачаєте місце на посилання. Це 4 байти на 32-розрядній системі або 8 байт на 64-розрядній системі. Однак, ви не витрачаєте місця для класу, на який посилання вказує, поки ви фактично не виділіть екземпляр цього класу, щоб вказати на посилання. Редагування: Що стосується рядка, String Java займає 16 біт (2 байти) для кожного символу, плюс невелика кількість накладних витрат на книгу, що, ймовірно, не є документальним і специфічним для реалізації.

  1. змінна типу посилань буде ініціалізована як значення null.
  2. null не є об'єктом. тому що (null instanceof Object) дорівнює false
  3. у JVM є лише одне значення null. Незалежно від того, скільки змінних посилається на null. Об'єкт s = (String) null; Об'єкт i = (Integer) null; System.out.println(s == i);//true

Ви можете використовувати jolотримати макет цього класу. (Однак будьте обережні, вам може знадобитися більш глибоке розуміння механіки, яка стоїть за ним, не довіряйте результату і будьте впевнені, що це лише оцінка для VM, що використовується в даний час (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. За допомогою compressed oop with 0-bit shift. За допомогою compressed klass with 0-bit shift. Objects є 8 bytes aligned. Field sizes by typ: 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 default constructor, falling back to class-только introspection. test.CheckStore об'єкт internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 12 (object header) N/A 12 1 boolean 4 String CheckStore.meaningfulText N/A 24 4 URL CheckStore.url N/A 28 4 (всіє, що ведеться до наступного об'єкта очікування) Вхідна величина: 32 bytes (призначений, текстовий код недоступний) 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 є 8 bytes aligned. Field sizes by typ: 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 default constructor, falling back to class-только introspection. test.CheckStore об'єкт 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 8 String CheckStore.meaningfulText N/A 40 8 URL CheckStore.url N/A Instance size: 48 bytes (досвідчений, недоступний для прикладу) Space losses: 7 bytes internal + 0 bytes external = 7 bytes total

Це тільки макети для самого об'єкта, якщо ваші поля дорівнюють null, то він не буде вказувати на більше об'єктів, інакше вам також потрібно подивитися на цільові типи (URL і String).(І якщо у вас є кілька екземплярів з усіх них, це залежить від того, чи використовуєте ви один і той же багаторазовий або різні). Поле null не може бути пропущено в пам'яті, оскільки вимагатиме зміни розміру екземпляра при його призначенні. Таким чином, усі поля заздалегідь сконструйовані, вони просто не посилаються на виділені об'єкти в іншому місці купи.

Якщо ви реалізуєте конструктор за замовчуванням, ви отримаєте більше деталей, але розмір у цьому конкретному випадку буде однаковим. Якщо вам цікаво, звідки береться послідовність і відступ полів, ви можете перевірити цю статтю - (в основному вона вирівнює об'єкти по 8 байтам, сортує поля за розміром, групує по одному типу, посилається на останнє. Поля з супер типів - перші, 4 байта вирівняні.)

Нуль означає 0. Зазвичай у пам'яті визначено одне місце, де null. Щоразу, коли хтось вказує на нього за допомогою мови програмування. Все вказує на те саме місце. Це означає, що тільки одна 4-байтова пам'ять використовується для NULL. Тоді будь-яка вказівка ​​на неї не споживає більше пам'яті. Визначення NULL є специфічним для мови, але його void *ptr=0 є загальним в C і C++. JAVA мало визначити його аналогічним чином. Немає можливості вказувати на щось інше. Вам потрібно вказувати щось інше. Але ми визначаємо спільне нічого, і всі вказівки на нього споживають лише цей простір.

Подібні статті

Останні статті

Категорії