Скільки пам'яті займає посилання на Java
Java - Чи вимагає порожня змінна місця в пам'яті
Коли я ініціалізую дві змінні (displayText і state) у конструкторі, чи вимагають дві інші змінні (meaningfulText і url) місця в пам'яті для зберігання значення null? Запитання 1. Якщо вони потребують місця, скільки пам'яті займає значення null у пам'яті? (наприклад, int займає 4 байти). Запитання 2. Скільки місця займає рядок у пам'яті? Скільки місця займає рядок у пам'яті? Чи це залежить від довжини рядка? java
4 відповіді
У Java, null - це просто значення, яке може мати посилання (яка в основному є обмеженим покажчиком). Це означає, що посилання посилається нічого. У цьому випадку ви все ще витрачаєте місце на посилання. Це 4 байти на 32-розрядній системі або 8 байт на 64-розрядній системі. Однак, ви не витрачаєте місця для класу, на який посилання вказує, поки ви фактично не виділіть екземпляр цього класу, щоб вказати на посилання. Редагування: Що стосується рядка, String Java займає 16 біт (2 байти) для кожного символу, плюс невелика кількість накладних витрат на книгу, що, ймовірно, не є документальним і специфічним для реалізації.
- змінна типу посилань буде ініціалізована як значення null.
- null не є об'єктом. тому що (null instanceof Object) дорівнює false
- у 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 мало визначити його аналогічним чином. Немає можливості вказувати на щось інше. Вам потрібно вказувати щось інше. Але ми визначаємо спільне нічого, і всі вказівки на нього споживають лише цей простір.
Подібні статті
- Скільки пам'яті займає Word
- Скільки пам'яті займає 1 піксель
- Скільки рівнів кеш пам'яті
- Скільки пам'яті у RTX 3050
- Скільки пам'яті в айфоні 6 плюс
- Скільки оперативної пам'яті на телефоні Honor 8S
- Скільки пам'яті у PlayStation 4
- Скільки кеш пам'яті потрібно процесору