Wo wird die Array-Länge in JVM gespeichert?

1. Übersicht

In diesem kurzen Tutorial werden wir sehen, wie und wo die HotSpot-JVM die Array-Länge speichert.

Normalerweise ist das Speicherlayout von Laufzeitdatenbereichen nicht Teil der JVM-Spezifikation und liegt im Ermessen des Implementierers. Daher kann jede JVM-Implementierung eine andere Strategie zum Layouten von Objekten und Arrays im Speicher haben.

In diesem Tutorial konzentrieren wir uns auf eine bestimmte JVM-Implementierung: die HotSpot-JVM. Wir können auch die JVM- und HotSpot-JVM-Begriffe austauschbar verwenden.

2. Abhängigkeit

Um das Speicherlayout von Arrays in der JVM zu überprüfen, verwenden wir das Java Object Layout (JOL) -Tool. Daher müssen wir die Jol-Core- Abhängigkeit hinzufügen :

 org.openjdk.jol jol-core 0.10 

3. Array-Länge

Die HotSpot-JVM verwendet eine Datenstruktur namens Ordinary Object Pointers (OOPs), um Zeiger auf Objekte darzustellen. Genauer gesagt repräsentiert die HotSpot-JVM die Arrays mit einem speziellen OOP namens arrayOop . Jedes arrayOop enthält einen Objektheader mit den folgenden Details:

  • Ein Markierungswort zum Speichern des Identitäts-Hash-Codes oder der GC-Informationen
  • Ein klassisches Wort zum Speichern allgemeiner Klassenmetadaten
  • 4 Bytes, die die Arraylänge darstellen

Daher speichert die JVM die Array-Länge im Objekt-Header .

Überprüfen Sie dies, indem Sie das Speicherlayout eines Arrays überprüfen:

int[] ints = new int[42]; System.out.println(ClassLayout.parseInstance(ints).toPrintable());

Wie oben gezeigt, analysieren wir das Speicherlayout von einer vorhandenen Array-Instanz. So legt die JVM das int [] fest :

[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

Wie bereits erwähnt, speichert die JVM die Array-Länge innerhalb des Objekt-Headers nach Markierungs- und Klass-Wörtern. Außerdem wird die Array-Länge in 4 Byte gespeichert, sodass sie nicht größer als der Maximalwert für eine 32-Bit-Ganzzahl sein kann.

Nach dem Objektheader speichert die JVM die tatsächlichen Array-Elemente. Da wir ein Array mit 42 Ganzzahlen haben, beträgt die Gesamtgröße des Arrays 168 Bytes - 42 multipliziert mit 4.

4. Fazit

In diesem kurzen Tutorial haben wir gesehen, wie die JVM die Array-Länge speichert.

Wie üblich sind alle Beispiele auf GitHub verfügbar.