Рубрики
Без рубрики

Где хранится длина массива в JVM?

Если вы всегда хотели знать, как JVM хранит длину массива, вы найдете ответ здесь.

Автор оригинала: 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 .