Minneadresse til objekter i Java

1. Oversikt

I denne raske opplæringen skal vi se hvordan du finner minneadressen til objekter i Java.

Før du går videre, er det verdt å nevne at minneoppsettet for kjøretidsdataområder ikke er 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. Dette vil igjen påvirke minneadressene.

I denne opplæringen fokuserer vi på en spesifikk JVM-implementering: HotSpot JVM. Vi kan også bruke JVM og HotSpot JVM vilkår om hverandre gjennom hele opplæringen.

2. Avhengighet

For å finne minneadressen til objekter 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. Minne-adresse

For å finne minneadressen til et bestemt objekt i JVM, kan vi bruke addressOf () metode:

String svar = "42"; System.out.println ("Minneadressen er" + VM.current (). AddressOf (svar));

Dette vil skrive ut:

Minneadressen er 31864981224

Det er forskjellige komprimerte referansemoduser i HotSpot JVM. På grunn av disse modusene kan det hende at denne verdien ikke er helt nøyaktig. Derfor bør vi ikke utføre noen hukommelsesmanipuleringer basert på denne adressen, da det kan føre til rare minnekorrupsjoner.

Også minneadresser i de fleste JVM-implementeringer kan endres når GC flytter objektene fra tid til annen.

4. Identitetskode

Det er en vanlig misforståelse at minneadressene til objekter i JVM er representert som en del av deres standard toString implementeringer, for eksempel [e-postbeskyttet]. Det vil si at mange tror at “60addb54” er minneadressen til det bestemte objektet.

La oss sjekke denne antagelsen:

Objekt obj = nytt objekt (); System.out.println ("Minne adresse:" + VM.current (). AddressOf (obj)); System.out.println ("toString:" + obj); System.out.println ("hashCode:" + obj.hashCode ()); System.out.println ("hashCode:" + System.identityHashCode (obj));

Dette vil skrive ut følgende:

Minneadresse: 31879960584 toString: [email protected] hashCode: 1622006612 hashCode: 1622006612

Ganske interessant, den “60addb54” er den heksadesimale versjonen av hash-koden, som er 1622006612. The hashCode () metoden er en av de vanlige metodene for alle Java-objekter. Når vi ikke erklærer en hashCode () metode for en klasse, vil Java bruke identitetshash-koden for den.

Som vist ovenfor, identitetshash-koden (den delen etter @ i toString) og minneadressen er forskjellig.

5. Konklusjon

I denne korte opplæringen så vi hvordan du finner minneadressen til objekter i Java.

Som vanlig er alle eksemplene tilgjengelige på GitHub.


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