Hol tárolják a tömb hosszát a JVM-ben?

1. Áttekintés

Ebben a gyors bemutatóban megnézzük, hogyan és hol tárolja a HotSpot JVM a tömb hosszát.

Általában a futási idejű adatterületek memóriaelrendezése nem része a JVM specifikációnak, és a végrehajtó belátása szerint marad. Ezért minden egyes JVM-megvalósításnak más stratégiája lehet, mint az objektumok és tömbök elrendezése a memóriában.

Ebben az oktatóanyagban egy konkrét JVM megvalósításra koncentrálunk: a HotSpot JVM-re. A JVM és a HotSpot JVM kifejezéseket felváltva is használhatjuk.

2. Függőség

A tömbök memóriaelrendezésének ellenőrzéséhez a JVM-ben a Java Object Layout (JOL) eszközt fogjuk használni. Ezért hozzá kell adnunk a jol-core függőség:

 org.openjdk.jol jol-core 0.10 

3. Tömb hossza

A HotSpot JVM egy szokásos objektummutatónak (OOP) nevezett adatszerkezetet használ az objektumok mutatóinak megjelenítésére. Pontosabban: a HotSpot JVM egy speciális OOP nevű tömböt képvisel arrayOop. Minden egyes arrayOop tartalmaz egy objektum fejlécet a következő részletekkel:

  • Egyetlen szó az identitás kivonat kódjának vagy a GC információk tárolásához
  • Egy osztályszó az általános metaadatok tárolására
  • 4 bájt a tömb hosszát képviseli

Ebből kifolyólag, a JVM tárolja a tömb hosszát az objektum fejlécében.

Ellenőrizzük ezt egy tömb memóriaelrendezésének vizsgálatával:

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

A fentiek szerint a memória elrendezését egy meglévő tömbpéldányból elemezzük. Így írja le a JVM a int []:

[I Object internals: OFFSET MÉRET TÍPUS LEÍRÁSI ÉRTÉK 0 4 (objektum fejléc) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) # 4 4-es jel (objektum fejléc) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) # mark 8 4 (objektum fejléc) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363) #klass 12 4 (objektum fejléc) 2a 00 00 00 (00101010 00000000 00000000 00000000) (42) # tömbhossz 16 168 int [ ÉN. N / A Példányméret: 184 bájt

Mint korábban említettük, a JVM a tömbhosszat tárolja az objektum fejlécében a mark és a klass szavak után. A tömb hossza 4 bájtban lesz tárolva, így nem lehet nagyobb, mint egy 32 bites egész szám maximális értéke.

Az objektumfejléc után a JVM tárolja a tényleges tömbelemeket. Mivel 42 egész tömbünk van, a tömb teljes mérete 168 bájt - 42 szorozva 4-gyel.

4. Következtetés

Ebben a rövid bemutatóban láttuk, hogy a JVM hogyan tárolja a tömb hosszát.

Szokás szerint az összes példa elérhető a GitHubon.