Gdje se pohranjuje duljina niza u JVM?
1. Pregled
U ovom brzom vodiču vidjet ćemo kako i gdje HotSpot JVM pohranjuje duljinu niza.
Obično raspored memorije podatkovnih područja tijekom izvođenja nije dio JVM specifikacije i prepušten je diskreciji implementatora. Stoga svaka JVM implementacija može imati drugačiju strategiju raspoređivanja objekata i nizova u memoriji.
U ovom se vodiču usredotočujemo na jednu specifičnu implementaciju JVM-a: HotSpot JVM. Također možemo koristiti JVM i HotSpot JVM pojmove naizmjenično.
2. Ovisnost
Da bismo pregledali raspored memorije nizova u JVM-u, koristit ćemo alat Java Layout Layout (JOL). Stoga moramo dodati jol-core ovisnost:
org.openjdk.jol jol-core 0.10
3. Duljina niza
HotSpot JVM koristi strukturu podataka koja se naziva Obični pokazivači na objekte (OOP) za predstavljanje pokazivača na objekte. Da budemo precizniji, HotSpot JVM predstavlja nizove s posebnim OOP-om koji se naziva nizOop. Svaki nizOop uključuje zaglavlje objekta sa sljedećim pojedinostima:
- Riječ s jednom oznakom za pohranu hash koda identiteta ili GC podataka
- Jedna klasova riječ za pohranu metapodataka opće klase
- 4 bajta koji predstavljaju duljinu polja
Stoga, JVM pohranjuje duljinu niza u zaglavlje objekta.
Provjerimo to pregledavajući raspored memorije niza:
int [] ints = novo int [42]; System.out.println (ClassLayout.parseInstance (ints) .toPrintable ());
Kao što je gore prikazano, analiziramo izgled memorije iz postojeće instance niza. Evo kako JVM postavlja int []:
[Unutarnji objekti objekta: SMJENA VELIČINE VRSTA OPIS VRIJEDNOST 0 4 (zaglavlje objekta) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) # oznaka 4 4 (zaglavlje objekta) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) # oznaka 8 4 (zaglavlje objekta) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363) #klass 12 4 (zaglavlje objekta) 2a 00 00 00 (00101010 00000000 00000000 00000000) (42) # dužina polja 16 168 int [ Ja N / A Veličina instance: 184 bajta
Kao što je ranije spomenuto, JVM pohranjuje duljinu niza unutar zaglavlja objekta nakon riječi marke i klass. Također, duljina polja pohranit će se u 4 bajta, tako da ne može biti veća od maksimalne vrijednosti za 32-bitni cijeli broj.
Nakon zaglavlja objekta, JVM pohranjuje stvarne elemente niza. Budući da imamo niz od 42 cijelih brojeva, ukupna veličina niza je 168 bajtova - 42 pomnoženo s 4.
4. Zaključak
U ovom kratkom vodiču vidjeli smo kako JVM pohranjuje duljinu niza.
Kao i obično, svi su primjeri dostupni na GitHubu.