Java >> Java tutorial >  >> JVM

Hvor er array-længden gemt i JVM?

1. Oversigt

I denne hurtige vejledning skal vi se, hvordan og hvor HotSpot JVM gemmer array-længden.

Normalt er hukommelseslayoutet af runtime-dataområder ikke en del af JVM-specifikationen og overlades til implementatorens skøn. Derfor kan hver JVM-implementering have en anden strategi til at layoute objekter og arrays i hukommelsen.

I denne tutorial fokuserer vi på én specifik JVM-implementering:HotSpot JVM. Vi kan også bruge JVM- og HotSpot JVM-vilkårene i flæng.

2. Afhængighed

For at inspicere hukommelseslayoutet af arrays i JVM'et, skal vi bruge værktøjet Java Object Layout (JOL). Derfor skal vi tilføje  jol-kernen afhængighed:

<dependency> 
    <groupId>org.openjdk.jol</groupId> 
    <artifactId>jol-core</artifactId>    
    <version>0.10</version> 
</dependency>

3. Arraylængde

HotSpot JVM bruger en datastruktur kaldet Ordinary Object Pointers (OOP'er) til at repræsentere pointere til objekter. For at være mere specifik repræsenterer HotSpot JVM arrays med en speciel OOP kaldet arrayOop . Hver arrayOop indeholder en objekthoved med følgende detaljer:

  • Et mærkeord til at gemme identitetshashkoden eller GC-oplysningerne
  • Et klasseord til at gemme generelle klassemetadata
  • 4 bytes, der repræsenterer matrixlængden

Derfor lagrer JVM array-længden i objekthovedet .

Lad os verificere dette ved at inspicere hukommelseslayoutet for et array:

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

Som vist ovenfor, analyserer vi hukommelseslayoutet fra en eksisterende array-instans. Her er, hvordan JVM'et opstiller 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.<elements>             N/A
Instance size: 184 bytes

Som tidligere nævnt gemmer JVM array-længden inde i objekthovedet efter mærke- og klasseord. Arraylængden vil også blive lagret i 4 bytes, så den kan ikke være større end den maksimale værdi for et 32-bit heltal.

Efter objekthovedet gemmer JVM de faktiske array-elementer. Da vi har en matrix på 42 heltal, er den samlede størrelse af matrixen 168 bytes — 42 ganget med 4.

4. Konklusion

I denne korte vejledning så vi, hvordan JVM gemmer array-længden.

Som sædvanlig er alle eksemplerne tilgængelige på GitHub.


Java tag