Къде се съхранява дължината на масива в JVM?

1. Общ преглед

В този бърз урок ще видим как и къде HotSpot JVM съхранява дължината на масива.

Обикновено оформлението на паметта на областите с данни за изпълнение не е част от спецификацията на JVM и е оставено на преценката на внедряващия. Следователно, всяка реализация на JVM може да има различна стратегия за оформление на обекти и масиви в паметта.

В този урок ние се фокусираме върху една специфична реализация на JVM: HotSpot JVM. Също така можем да използваме термините JVM и HotSpot JVM взаимозаменяемо.

2. Зависимост

За да проверим оформлението на паметта на масивите в JVM, ще използваме инструмента за оформление на обекти Java (JOL). Следователно трябва да добавим зависимостта на jol-core :

 org.openjdk.jol jol-core 0.10 

3. Дължина на масива

HotSpot JVM използва структура от данни, наречена Ordinary Object Pointers (OOPs), за да представя указатели към обекти. За да бъдем по-конкретни, HotSpot JVM представлява масивите със специален ООП, наречен 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 съхранява дължината на масива в заглавката на обекта след марки и класови думи. Също така дължината на масива ще се съхранява в 4 байта, така че не може да бъде по-голяма от максималната стойност за 32-битово цяло число.

След заглавката на обекта JVM съхранява действителните елементи на масива. Тъй като имаме масив от 42 цели числа, общият размер на масива е 168 байта - 42, умножен по 4.

4. Заключение

В този кратък урок видяхме как JVM съхранява дължината на масива.

Както обикновено, всички примери са достъпни в GitHub.