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.