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.