Adresa memorije objekata u Javi

1. Pregled

U ovom brzom vodiču vidjet ćemo kako pronaći memorijsku adresu objekata u Javi.

Prije nego što nastavite dalje, vrijedi spomenuti da raspored memorije područja izvođenja podataka 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. To će pak utjecati na adrese memorije.

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 tijekom podučavanja.

2. Ovisnost

Da bismo pronašli memorijsku adresu objekata u JVM-u, poslužit ćemo se alatom Java Object Layout (JOL). Stoga moramo dodati jol-core ovisnost:

 org.openjdk.jol jol-core 0.10 

3. Adresa memorije

Da bismo pronašli memorijsku adresu određenog objekta u JVM-u, možemo koristiti addressOf () metoda:

String odgovor = "42"; System.out.println ("Adresa memorije je" + VM.current (). AddressOf (odgovor));

Ovo će ispisati:

Adresa memorije je 31864981224

U HotSpot JVM postoje različiti komprimirani referentni načini. Zbog ovih načina rada ova vrijednost možda nije potpuno točna. Stoga ne bismo trebali ići na izvršavanje nekih manipulacija matičnom memorijom na temelju ove adrese, jer to može uzrokovati čudne oštećenja memorije.

Također, memorijske adrese u većini JVM implementacija podložne su promjenama dok GC s vremena na vrijeme pomiče objekte.

4. Šifra identiteta za raspršivanje

Uobičajena je zabluda da su memorijske adrese objekata u JVM-u predstavljene kao dio njihove zadane vrijednosti toString implementacije, kao što su [e-pošta zaštićena]. Odnosno, mnogi misle da "60addb54" je memorijska adresa tog određenog objekta.

Provjerimo ovu pretpostavku:

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

Ovo će ispisati sljedeće:

Adresa memorije: 31879960584 toString: [zaštićena e-poštom] hashCode: 1622006612 hashCode: 1622006612

Sasvim zanimljivo, "60addb54" je heksadecimalna verzija hash koda, koja je 1622006612. The hashCode () metoda jedna je od uobičajenih metoda za sve Java objekte. Kada ne izjavimo a hashCode () metoda za klasu, Java će za nju upotrijebiti hash kod identiteta.

Kao što je prikazano gore, hash kôd identiteta (onaj dio nakon @ u toString) i memorijska adresa su različite.

5. Zaključak

U ovom kratkom vodiču vidjeli smo kako pronaći memorijsku adresu objekata u Javi.

Kao i obično, svi su primjeri dostupni na GitHubu.


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