Waar wordt de array-lengte opgeslagen in JVM?

1. Overzicht

In deze korte tutorial gaan we zien hoe en waar de HotSpot JVM de array-lengte opslaat.

Gewoonlijk maakt de geheugenlay-out van runtime-gegevensgebieden geen deel uit van de JVM-specificatie en wordt deze overgelaten aan de discretie van de implementator. Daarom kan elke JVM-implementatie een andere strategie hebben om objecten en arrays in het geheugen op te maken.

In deze tutorial concentreren we ons op één specifieke JVM-implementatie: de HotSpot JVM. We kunnen de termen JVM en HotSpot JVM ook door elkaar gebruiken.

2. Afhankelijkheid

Om de geheugenlay-out van arrays in de JVM te inspecteren, gaan we de Java Object Layout (JOL) -tool gebruiken. Daarom moeten we het jol-core afhankelijkheid:

 org.openjdk.jol jol-core 0.10 

3. Matrixlengte

De HotSpot JVM gebruikt een datastructuur genaamd Ordinary Object Pointers (OOP's) om verwijzingen naar objecten weer te geven. Om specifieker te zijn, vertegenwoordigt de HotSpot JVM de arrays met een speciale OOP genaamd arrayOop. Elk arrayOop bevat een objectkop met de volgende details:

  • Eén markeerwoord om de identiteitshashcode of GC-informatie op te slaan
  • Eén klass-woord om metagegevens van algemene klassen op te slaan
  • 4 bytes die de arraylengte vertegenwoordigen

Daarom de JVM slaat de array-lengte op in de objectkop.

Laten we dit verifiëren door de geheugenlay-out van een array te inspecteren:

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

Zoals hierboven getoond, ontleden we de geheugenlay-out van een bestaande array-instantie. Hier is hoe de JVM de int []:

[I object internals: OFFSET SIZE TYPE BESCHRIJVING WAARDE 0 4 (objectkop) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) # markering 4 4 (objectkop) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) # mark 8 4 (objectheader) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363) #klass 12 4 (objectheader) 2a 00 00 00 (00101010 00000000 00000000 00000000) (42) # array-lengte 16168 int [ IK. Nvt Instantiegrootte: 184 bytes

Zoals eerder vermeld, slaat de JVM de array-lengte op in de objectkop na mark- en klass-woorden. De arraylengte wordt ook opgeslagen in 4 bytes, dus deze kan niet groter zijn dan de maximale waarde voor een 32-bits geheel getal.

Na de objectkop slaat de JVM de feitelijke array-elementen op. Omdat we een array van 42 gehele getallen hebben, is de totale grootte van de array 168 bytes - 42 vermenigvuldigd met 4.

4. Conclusie

In deze korte tutorial hebben we gezien hoe de JVM de array-lengte opslaat.

Zoals gewoonlijk zijn alle voorbeelden beschikbaar op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found