Mixalis Navridis:
Все , что я пришел с простым вопросом. Согласно ява документации и многих статей о макете объекта памяти Java , если у нас есть класс с одной int
переменной общее потребление памяти для этого объекта будет:
- 8 байт для заголовка
- 4 байта для Int
- 4 байта обивки (с круглым общим до быть кратными 8 байт) = 16 Всего байт
public class Ab {
int b;
}
public static void main(String args[]) throws InterruptedException {
Ab ab = new AB();
}
Моя проблема сейчас в том , что , когда я использовал Визуальную виртуальную машину и посмотреть на свалке кучной соблюдать это теоретический подход , я заметил , что потребление памяти для этого объекта было 20 байт , а не 16 ? Почему это происходит? Может кто - нибудь объяснить мне?
Александр Пирогова:
Использование макета объекта Java инструмент , который я получил следующий вывод:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 4 int Ab.b N/A
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
И с -XX:-UseCompressedOops
опцией VM (отключить сжатые ссылки):
OFFSET SIZE TYPE DESCRIPTION VALUE
0 16 (object header) N/A
16 4 int Ab.b N/A
20 4 (loss due to the next object alignment)
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
Java среда:
java version "11" 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11+28)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11+28, mixed mode)