Geheugenadres van objecten in Java

1. Overzicht

In deze korte tutorial gaan we zien hoe we het geheugenadres van objecten in Java kunnen vinden.

Voordat we verder gaan, is het de moeite waard te vermelden dat de geheugenlay-out van runtime-gegevensgebieden geen deel uitmaakt van de JVM-specificatie en wordt overgelaten aan de discretie van de implementator. Daarom kan elke JVM-implementatie een andere strategie hebben om objecten en arrays in het geheugen op te maken. Dit heeft op zijn beurt invloed op de geheugenadressen.

In deze tutorial concentreren we ons op één specifieke JVM-implementatie: de HotSpot JVM. We kunnen de JVM- en HotSpot JVM-termen ook door elkaar gebruiken tijdens de tutorial.

2. Afhankelijkheid

Om het geheugenadres van objecten in de JVM te vinden, gaan we de Java Object Layout (JOL) -tool gebruiken. Daarom moeten we het jol-core afhankelijkheid:

 org.openjdk.jol jol-core 0.10 

3. Geheugenadres

Om het geheugenadres van een bepaald object in de JVM te vinden, kunnen we de addressOf () methode:

String answer = "42"; System.out.println ("Het geheugenadres is" + VM.current (). AddressOf (antwoord));

Dit zal afdrukken:

Het geheugenadres is 31864981224

Er zijn verschillende gecomprimeerde referentiemodi in de HotSpot JVM. Vanwege deze modi is deze waarde mogelijk niet helemaal nauwkeurig. Daarom moeten we niet gaan en enkele native geheugenmanipulaties uitvoeren op basis van dit adres, omdat dit rare geheugencorrupties kan veroorzaken.

Ook zijn geheugenadressen in de meeste JVM-implementaties aan verandering onderhevig, aangezien de GC de objecten van tijd tot tijd verplaatst.

4. Identiteitshashcode

Er is een algemene misvatting dat de geheugenadressen van objecten in de JVM worden weergegeven als onderdeel van hun standaardinstellingen toString implementaties, zoals [e-mail beveiligd]. Dat wil zeggen, velen denken dat de "60addb54" is het geheugenadres van dat specifieke object.

Laten we deze aanname eens bekijken:

Object obj = nieuw object (); System.out.println ("Geheugenadres:" + VM.current (). AddressOf (obj)); System.out.println ("toString:" + obj); System.out.println ("hashCode:" + obj.hashCode ()); System.out.println ("hashCode:" + System.identityHashCode (obj));

Dit zal het volgende afdrukken:

Geheugenadres: 31879960584 toString: [email protected] hashCode: 1622006612 hashCode: 1622006612

Interessant genoeg is de "60addb54" is de hexadecimale versie van de hashcode, namelijk 1622006612. De hashCode () methode is een van de gebruikelijke methoden voor alle Java-objecten. Als we geen hashCode () methode voor een klasse, zal Java de identiteit-hashcode ervoor gebruiken.

Zoals hierboven getoond, de hash-code van de identiteit (dat deel na @ in toString) en het geheugenadres zijn verschillend.

5. Conclusie

In deze korte tutorial hebben we gezien hoe we het geheugenadres van objecten in Java kunnen vinden.

Zoals gewoonlijk zijn alle voorbeelden beschikbaar op GitHub.