Objektumok memória címe a Java-ban

1. Áttekintés

Ebben a gyors bemutatóban megnézzük, hogyan lehet megtalálni az objektumok memóriacímét a Java-ban.

Mielőtt tovább folytatnánk, érdemes megemlíteni, hogy a futásidejű adatok memória elrendezése nem része a JVM specifikációnak, és a végrehajtó belátására bízzák. Ezért minden egyes JVM-megvalósításnak más stratégiája lehet, mint az objektumok és tömbök elrendezése a memóriában. Ez viszont hatással lesz a memória címekre.

Ebben az oktatóanyagban egy konkrét JVM megvalósításra koncentrálunk: a HotSpot JVM-re. A JVM és a HotSpot JVM kifejezéseket felváltva is használhatjuk az oktatóanyagban.

2. Függőség

Az objektumok memóriacímének megkereséséhez a JVM-ben a Java Object Layout (JOL) eszközt fogjuk használni. Ezért hozzá kell adnunk a jol-core függőség:

 org.openjdk.jol jol-core 0.10 

3. Memória cím

Egy adott objektum memóriacímének megtalálásához a JVM-ben használhatjuk a addressOf () módszer:

Karakterlánc-válasz = "42"; System.out.println ("A memória címe" + VM.current (). AddressOf (válasz));

Ez kinyomtatja:

A memória címe: 31864981224

Különböző tömörített referencia módok vannak a HotSpot JVM-ben. Ezen üzemmódok miatt előfordulhat, hogy ez az érték nem teljesen pontos. Ezért nem szabad elmozdulnunk néhány natív memória-manipulációval ezen a címen, mert furcsa memóriasérüléseket okozhat.

Emellett a legtöbb JVM-megvalósítás memóriacíme megváltozhat, mivel a GC időről időre mozgatja az objektumokat.

4. Identity Hash Code

Gyakori tévhit, hogy az objektumok memóriacímei a JVM-ben az alapértelmezett részeiként vannak ábrázolva Sztring megvalósítások, mint pl [e-mail védett]. Vagyis sokan azt gondolják, hogy a „60addb54” az adott objektum memória címe.

Ellenőrizzük ezt a feltételezést:

Object obj = new Object (); System.out.println ("Memória címe:" + VM.current (). AddressOf (obj)); System.out.println ("toString:" + obj); System.out.println ("hashCode:" + obj.hashCode ()); System.out.println ("hashCode:" + System.identityHashCode (obj));

Ez a következőket nyomtatja ki:

Memória cím: 31879960584 toString: [e-mail védett] hashCode: 1622006612 hashCode: 1622006612

Egész érdekes módon a „60addb54” a hash kód hexadecimális változata, amely 1622006612 hash kód() metódus az összes Java objektum egyik általános módszere. Amikor nem nyilatkozunk a hash kód() módszerrel, a Java az azonosító kivonatkódot fogja használni.

A fentiek szerint az azonosító hash kód (az a rész utána @ ban ben Sztring) és a memória címe különbözik.

5. Következtetés

Ebben a rövid bemutatóban azt láthattuk, hogyan lehet megtalálni az objektumok memóriacímét a Java-ban.

Szokás szerint az összes példa elérhető a GitHubon.