Hvor lagres matriselengden i JVM?
1. Oversikt
I denne raske opplæringen skal vi se hvordan og hvor HotSpot JVM lagrer matriselengden.
Vanligvis er minneoppsettet for kjøretidsdataområder ikke en del av JVM-spesifikasjonen og overlates til implementeringsmyndighetens skjønn. Derfor kan hver JVM-implementering ha en annen strategi for å utforme objekter og matriser i minnet.
I denne opplæringen fokuserer vi på en spesifikk JVM-implementering: HotSpot JVM. Vi kan også bruke vilkårene JVM og HotSpot JVM om hverandre.
2. Avhengighet
For å inspisere minneoppsettet til matriser i JVM, skal vi bruke JOL-verktøyet (Java Object Layout). Derfor må vi legge til jol-core avhengighet:
org.openjdk.jol jol-core 0.10
3. Array Lengde
HotSpot JVM bruker en datastruktur kalt Ordinære objektpeker (OOP) for å representere pekere til objekter. For å være mer spesifikk, representerer HotSpot JVM matriser med en spesiell OOP kalt arrayOop. Hver arrayOop inneholder en objekthode med følgende detaljer:
- Ett merkeord for å lagre identitetshashkoden eller GC-informasjonen
- Ett klassisk ord for å lagre metadata for generell klasse
- 4 byte som representerer matriselengden
Derfor, JVM lagrer matriselengden i objektoverskriften.
La oss verifisere dette ved å inspisere minneoppsettet til en matrise:
int [] ints = new int [42]; System.out.println (ClassLayout.parseInstance (ints) .toPrintable ());
Som vist ovenfor analyserer vi minneoppsettet fra en eksisterende matriseforekomst. Slik legger JVM ut int []:
[Jeg motsetter meg internt: OFFSET STØRRELSE TYPE BESKRIVELSE VERDI 0 4 (objektoverskrift) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) # merke 4 4 (objektoverskrift) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) # merke 8 4 (objektoverskrift) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363) #klass 12 4 (objektoverskrift) 2a 00 00 00 (00101010 00000000 00000000 00000000) (42) # matriselengde 16 168 int [ JEG. N / A Forekomststørrelse: 184 byte
Som nevnt tidligere lagrer JVM matriselengden inne i objektoverskriften etter merke og klass ord. Også matriselengden lagres i 4 byte, så den kan ikke være større enn maksimumsverdien for et 32-biters heltall.
Etter objektoverskriften lagrer JVM de faktiske matriseelementene. Siden vi har en matrise på 42 heltall, er den totale størrelsen på matrisen 168 byte - 42 multiplisert med 4.
4. Konklusjon
I denne korte opplæringen så vi hvordan JVM lagrer matriselengden.
Som vanlig er alle eksemplene tilgjengelige på GitHub.