Hukommelsesadresse for objekter i Java

1. Oversigt

I denne hurtige vejledning skal vi se, hvordan du finder hukommelsesadressen på objekter i Java.

Inden du går videre, er det værd at nævne, at hukommelseslayoutet for runtime-dataområder ikke er en del af JVM-specifikationen og er overladt til implementerers skøn. Derfor kan hver JVM-implementering have en anden strategi til layout af objekter og arrays i hukommelsen. Dette vil igen påvirke hukommelsesadresserne.

I denne vejledning fokuserer vi på en specifik JVM-implementering: HotSpot JVM. Vi kan også bruge JVM og HotSpot JVM-termerne i flæng under hele tutorialen.

2. Afhængighed

For at finde hukommelsesadressen på objekter i JVM skal vi bruge Java Object Layout (JOL) -værktøjet. Derfor er vi nødt til at tilføje jol-core afhængighed:

 org.openjdk.jol jol-core 0.10 

3. Hukommelsesadresse

For at finde hukommelsesadressen til et bestemt objekt i JVM kan vi bruge addressOf () metode:

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

Dette vil udskrive:

Hukommelsesadressen er 31864981224

Der er forskellige komprimerede referencetilstande i HotSpot JVM. På grund af disse tilstande er denne værdi muligvis ikke helt nøjagtig. Derfor bør vi ikke gå og udføre nogle indbyggede hukommelsesmanipulationer baseret på denne adresse, da det kan forårsage underlige hukommelseskorruptioner.

Hukommelsesadresser i de fleste JVM-implementeringer kan også ændres, når GC flytter objekterne fra tid til anden.

4. Identitet Hash-kode

Der er en almindelig misforståelse om, at hukommelsesadresserne til objekter i JVM er repræsenteret som en del af deres standard toString implementeringer, såsom [e-mail beskyttet]. Mange mener, at “60addb54” er hukommelsesadressen for det bestemte objekt.

Lad os kontrollere denne antagelse:

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

Dette vil udskrive følgende:

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

Ganske interessant er det “60addb54” er den hexadecimale version af hash-koden, som er 1622006612. The hashCode () metode er en af ​​de almindelige metoder for alle Java-objekter. Når vi ikke erklærer en hashCode () metode til en klasse, bruger Java identitetshash-koden til den.

Som vist ovenfor, identitetshash-koden (den del efter @ i toString) og hukommelsesadressen er forskellig.

5. Konklusion

I denne korte vejledning så vi, hvordan man finder hukommelsesadressen på objekter i Java.

Som sædvanligt er alle eksemplerne tilgængelige på GitHub.


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