Hvor gemmes matrixlængden i JVM?

1. Oversigt

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

Normalt er hukommelseslayoutet for runtime-dataarealer ikke en del af JVM-specifikationen og overlades til implementerers skøn. Derfor kan hver JVM-implementering have en anden strategi til layout af objekter og arrays i hukommelsen.

I denne vejledning fokuserer vi på en specifik JVM-implementering: HotSpot JVM. Vi kan også bruge JVM og HotSpot JVM-termerne ombytteligt.

2. Afhængighed

For at inspicere hukommelseslayoutet for arrays i JVM skal vi bruge Java Object Layout (JOL) -værktøjet. Derfor er vi nødt til at tilføje jol-core afhængighed:

 org.openjdk.jol jol-core 0.10 

3. Array længde

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

  • Et mærkeord for at gemme identitetshash-koden eller GC-informationen
  • Et klassisk ord til at gemme metadata for generelle klasser
  • 4 bytes, der repræsenterer matrixlængden

Derfor, JVM gemmer matrixlængden i objektoverskriften.

Lad os kontrollere dette ved at inspicere et arrays hukommelseslayout:

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

Som vist ovenfor analyserer vi hukommelseslayoutet fra en eksisterende array-forekomst. Her er hvordan JVM lægger ud int []:

[Jeg protesterer internt: OFFSET STØRRELSE TYPE BESKRIVELSE VÆRDI 0 4 (objektoverskrift) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) # mark 4 4 (objektoverskrift) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) # mark 8 4 (objektoverskrift) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363) #klasse 12 4 (objektoverskrift) 2a 00 00 00 (00101010 00000000 00000000 00000000) (42) # array længde 16 168 int [ JEG. Ikke relevant Instansstørrelse: 184 bytes

Som tidligere nævnt gemmer JVM array-længden inde i objektoverskriften efter mark og klass-ord. Arraylængden gemmes også i 4 byte, så den kan ikke være større end den maksimale værdi for et 32-bit heltal.

Efter objektoverskriften gemmer JVM de aktuelle matrixelementer. Da vi har en matrix på 42 heltal, er den samlede størrelse af arrayet 168 bytes - 42 ganget med 4.

4. Konklusion

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

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