Kde je uložená dĺžka poľa v JVM?

1. Prehľad

V tomto rýchlom výučbe sa dozvieme, ako a kde HotSpot JVM ukladá dĺžku poľa.

Zvyčajne pamäťové rozloženie dátových oblastí za behu nie je súčasťou špecifikácie JVM a je ponechané na uváženie implementátora. Preto môže mať každá implementácia JVM inú stratégiu ako rozloženie objektov a polí v pamäti.

V tomto tutoriáli sa zameriavame na jednu konkrétnu implementáciu JVM: HotSpot JVM. Podmienky JVM a HotSpot JVM môžeme tiež používať vzájomne zameniteľné.

2. Závislosť

Aby sme skontrolovali rozloženie pamäte polí v JVM, použijeme nástroj JOL (Java Object Layout). Preto musíme pridať veselé jadro závislosť:

 org.openjdk.jol jol-core 0,10 

3. Dĺžka poľa

HotSpot JVM používa dátovú štruktúru nazvanú Ordinary Object Pointers (OOP), ktorá predstavuje ukazovatele na objekty. Aby sme boli konkrétnejší, HotSpot JVM predstavuje polia so špeciálnym volaným OOP arrayOop. Každý arrayOop obsahuje hlavičku objektu s nasledujúcimi podrobnosťami:

  • Jedno značkové slovo na uloženie hašovacieho kódu identity alebo informácií GC
  • Jedno slovo triedy na uloženie metadát všeobecnej triedy
  • 4 bajty predstavujúce dĺžku poľa

Preto JVM uloží dĺžku poľa do hlavičky objektu.

Poďme to overiť kontrolou rozloženia pamäte poľa:

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

Ako je uvedené vyššie, analyzujeme rozloženie pamäte z existujúcej inštancie poľa. Tu je príklad, ako JVM stanovuje int []:

[Vnútorné objekty I: TYP VEĽKOSTI POSUNU POPIS HODNOTA 0 4 (hlavička objektu) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) # značka 4 4 (hlavička objektu) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) # značka 8 4 (hlavička objektu) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363) #klass 12 4 (hlavička objektu) 2a 00 00 00 (00101010 00000000 00000000 00000000) (42) # dĺžka poľa 16 168 int [ I. N / A Veľkosť inštancie: 184 bajtov

Ako už bolo spomenuté, JVM ukladá dĺžku poľa do hlavičky objektu po slovách značiek a tried. Dĺžka poľa bude tiež uložená v 4 bajtoch, takže nemôže byť väčšia ako maximálna hodnota pre 32-bitové celé číslo.

Za hlavičkou objektu JVM ukladá skutočné prvky poľa. Pretože máme pole 42 celých čísel, celková veľkosť poľa je 168 bajtov - 42 krát 4.

4. Záver

V tomto krátkom tutoriáli sme videli, ako JVM ukladá dĺžku poľa.

Ako obvykle sú všetky príklady dostupné na GitHub.


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