Автор оригинала: Ali Dehghani.
1. Обзор
В этом кратком руководстве мы рассмотрим, как и где JVM HotSpot хранит длину массива.
Обычно компоновка памяти областей данных среды выполнения не является частью спецификации JVM и оставляется на усмотрение разработчика . Поэтому каждая реализация JVM может иметь различную стратегию размещения объектов и массивов в памяти.
В этом уроке мы сосредоточимся на одной конкретной реализации JVM: JVM HotSpot. Мы также можем использовать термины JVM и HotSpot JVM взаимозаменяемо.
2. Зависимость
Чтобы проверить расположение памяти массивов в JVM, мы собираемся использовать инструмент Java Object Layout ( JOL ). Поэтому нам нужно добавить зависимость jol-core :
org.openjdk.jol jol-core 0.10
3. Длина массива
JVM HotSpot использует структуру данных, называемую обычными указателями объектов ( OOPs ), для представления указателей на объекты. Чтобы быть более конкретным, JVM HotSpot представляет массивы с помощью специального приложения под названием arrayOop . Каждый arrayOop содержит заголовок объекта со следующими подробностями:
- Одно слово метки для хранения идентификационного хэш-кода или информации о GC
- Одно слово класса для хранения общих метаданных класса
- 4 байта, представляющие длину массива
Поэтому JVM хранит длину массива в заголовке объекта .
Давайте проверим это, проверив расположение памяти массива:
int[] ints = new int[42]; System.out.println(ClassLayout.parseInstance(ints).toPrintable());
Как показано выше, мы анализируем макет памяти из существующего экземпляра массива. Вот как JVM выкладывает int[] :
[I object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) # mark 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) # mark 8 4 (object header) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363) #klass 12 4 (object header) 2a 00 00 00 (00101010 00000000 00000000 00000000) (42) # array length 16 168 int [I.N/A Instance size: 184 bytes
Как упоминалось ранее, JVM хранит длину массива внутри заголовка объекта после слов mark и klass. Кроме того, длина массива будет храниться в 4 байтах, поэтому она не может быть больше максимального значения для 32-разрядного целого числа.
После заголовка объекта JVM хранит фактические элементы массива. Поскольку у нас есть массив из 42 целых чисел, общий размер массива составляет 168 байт — 42, умноженное на 4.
4. Заключение
В этом коротком уроке мы увидели, как JVM хранит длину массива.
Как обычно, все примеры доступны на GitHub .