Hvor lagres matriselengden i JVM?

1. Oversikt

I denne raske opplæringen skal vi se hvordan og hvor HotSpot JVM lagrer matriselengden.

Vanligvis er minneoppsettet for kjøretidsdataområder ikke en del av JVM-spesifikasjonen og overlates til implementeringsmyndighetens skjønn. Derfor kan hver JVM-implementering ha en annen strategi for å utforme objekter og matriser i minnet.

I denne opplæringen fokuserer vi på en spesifikk JVM-implementering: HotSpot JVM. Vi kan også bruke vilkårene JVM og HotSpot JVM om hverandre.

2. Avhengighet

For å inspisere minneoppsettet til matriser i JVM, skal vi bruke JOL-verktøyet (Java Object Layout). Derfor må vi legge til jol-core avhengighet:

 org.openjdk.jol jol-core 0.10 

3. Array Lengde

HotSpot JVM bruker en datastruktur kalt Ordinære objektpeker (OOP) for å representere pekere til objekter. For å være mer spesifikk, representerer HotSpot JVM matriser med en spesiell OOP kalt arrayOop. Hver arrayOop inneholder en objekthode med følgende detaljer:

  • Ett merkeord for å lagre identitetshashkoden eller GC-informasjonen
  • Ett klassisk ord for å lagre metadata for generell klasse
  • 4 byte som representerer matriselengden

Derfor, JVM lagrer matriselengden i objektoverskriften.

La oss verifisere dette ved å inspisere minneoppsettet til en matrise:

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

Som vist ovenfor analyserer vi minneoppsettet fra en eksisterende matriseforekomst. Slik legger JVM ut int []:

[Jeg motsetter meg internt: OFFSET STØRRELSE TYPE BESKRIVELSE VERDI 0 4 (objektoverskrift) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) # merke 4 4 ​​(objektoverskrift) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) # merke 8 4 (objektoverskrift) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363) #klass 12 4 (objektoverskrift) 2a 00 00 00 (00101010 00000000 00000000 00000000) (42) # matriselengde 16 168 int [ JEG. N / A Forekomststørrelse: 184 byte

Som nevnt tidligere lagrer JVM matriselengden inne i objektoverskriften etter merke og klass ord. Også matriselengden lagres i 4 byte, så den kan ikke være større enn maksimumsverdien for et 32-biters heltall.

Etter objektoverskriften lagrer JVM de faktiske matriseelementene. Siden vi har en matrise på 42 heltall, er den totale størrelsen på matrisen 168 byte - 42 multiplisert med 4.

4. Konklusjon

I denne korte opplæringen så vi hvordan JVM lagrer matriselengden.

Som vanlig er alle eksemplene tilgjengelige på GitHub.


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