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.