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.