Pamäťová adresa objektov v Jave

1. Prehľad

V tomto rýchlom výučbe sa dozvieme, ako nájsť pamäťovú adresu objektov v prostredí Java.

Predtým, ako pôjdeme ďalej, stojí za zmienku, že rozloženie pamäte runtime dátových oblastí nie je súčasťou špecifikácie JVM a je ponechané na uváženie implementátora. Preto môže mať každá implementácia JVM inú stratégiu ako rozloženie objektov a polí v pamäti. To zase ovplyvní adresy pamäte.

V tomto tutoriáli sa zameriavame na jednu konkrétnu implementáciu JVM: HotSpot JVM. V rámci tohto tutoriálu môžeme tiež používať pojmy JVM a HotSpot JVM zameniteľné.

2. Závislosť

Na nájdenie adresy pamäte objektov v JVM použijeme nástroj Java Object Layout (JOL). Preto musíme pridať veselé jadro závislosť:

 org.openjdk.jol jol-core 0,10 

3. Adresa pamäte

Na nájdenie adresy pamäte konkrétneho objektu v JVM môžeme použiť addressOf () metóda:

Reťazcová odpoveď = "42"; System.out.println ("Adresa pamäte je" + VM.current (). AddressOf (odpoveď));

Týmto sa vytlačí:

Adresa pamäte je 31864981224

V HotSpote JVM existujú rôzne komprimované referenčné režimy. Kvôli týmto režimom nemusí byť táto hodnota úplne presná. Preto by sme nemali ísť robiť nejaké manipulácie s natívnou pamäťou založené na tejto adrese, pretože by to mohlo spôsobiť čudné poškodenia pamäte.

Pamäťové adresy vo väčšine implementácií JVM sa tiež môžu meniť, pretože GC z času na čas pohybuje objektmi.

4. Identifikačný hash kód

Existuje všeobecná mylná predstava, že pamäťové adresy objektov v JVM sú reprezentované ako súčasť ich predvoleného nastavenia natiahnuť implementácie, ako napr [chránené e-mailom]. To znamená, že mnohí si myslia, že „60addb54“ je adresa pamäte konkrétneho objektu.

Poďme skontrolovať tento predpoklad:

Object obj = new Object (); System.out.println ("Adresa pamäte:" + VM.current (). AddressOf (obj)); System.out.println ("toString:" + obj); System.out.println ("hashCode:" + obj.hashCode ()); System.out.println ("hashCode:" + System.identityHashCode (obj));

Týmto sa vytlačí nasledovné:

Adresa pamäte: 31879960584 toString: [chránený e-mailom] hashCode: 1622006612 hashCode: 1622006612

Celkom zaujímavé je „60addb54“ je hexadecimálna verzia hash kódu, ktorý je 1622006612. hashCode () metóda je jednou z bežných metód pre všetky objekty Java. Keď nedeklarujeme a hashCode () metóda pre triedu, Java pre ňu použije hashový kód identity.

Ako je uvedené vyššie, kód hash identity (tá časť po @ v natiahnuť) a adresa pamäte sú odlišné.

5. Záver

V tomto krátkom tutoriáli sme videli, ako nájsť pamäťovú adresu objektov v Jave.

Ako obvykle sú všetky príklady dostupné na GitHub.


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