Java obtient l'adresse mémoire d'un objet

avant-propos

Nous savons qu'en Java, synchronizedl'objet instance courant est verrouillé pour la méthode de synchronisation.
Par exemple le bout de code suivant :

import java.util.concurrent.TimeUnit;

public class Test {
    
    
    public static void main(String[] args) {
    
    
        Test test = new Test();
        test.helper();
    }

    public synchronized void helper() {
    
    
        try {
    
    
            System.out.println("hello");
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }
}

Après le vidage, nous pouvons obtenir les informations suivantes :

"main" #1 prio=5 os_prio=0 tid=0x00c46c00 nid=0x1d60 waiting on condition [0x00ddf000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
	at java.lang.Thread.sleep(Native Method)
	at java.lang.Thread.sleep(Thread.java:340)
	at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
	at Test.helper(Test.java:16)
	- locked <0x09db48c0> (a Test)
	at Test.main(Test.java:10)

L'adresse mémoire de l'instance test de Test est <0x09db48c0>. Comment vérifier que cette adresse est notre adresse mémoire ?

texte

Introduire des dépendances

Ajoutez des dépendances dans pom.xml :

        <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.10</version>
        </dependency>

utiliser

C'est simple à utiliser :

VM.current().addressOf(test)

Le mettre dans notre code est:

import org.openjdk.jol.vm.VM;

import java.util.concurrent.TimeUnit;

public class Test {
    
    
    public static void main(String[] args) {
    
    
        Test test = new Test();
        System.out.println("The memory address is " + VM.current().addressOf(test));
        System.out.println("The memory address is " + Long.toHexString(VM.current().addressOf(test)));
        test.helper();
    }

    public synchronized void helper() {
    
    
        try {
    
    
            System.out.println("hello");
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }
}

Dans la console, nous pouvons voir la sortie :

The memory address is 165365952
The memory address is 9db48c0
hello

en conclusion

En introduisant org.openjdk.jolon peut obtenir rapidement l'adresse mémoire de l'objet. Un regard général sur le code source pertinent montre que la couche inférieure est unsafejugée à l'aide de classes.

JOL (Java Object Layout) est la petite boîte à outils pour analyser les schémas de disposition des objets dans les JVM. Ces outils utilisent fortement Unsafe, JVMTI et Serviceability Agent (SA) pour décoder la disposition, l'empreinte et les références réelles de l'objet. Cela rend JOL beaucoup plus précis que d'autres outils reposant sur des vidages de tas, des hypothèses de spécification, etc.

(Java Object Layout) est une petite boîte à outils pour analyser les schémas de disposition des objets dans le jvm. Ces outils utilisent intensivement Unsafe, JVMTI et Serviceability Agent (SA) pour décoder la disposition réelle de l'objet, l'empreinte mémoire et les références. Cela rend JOL plus précis que d'autres outils qui reposent sur des vidages de tas, des hypothèses de spécification, etc.

Je suppose que tu aimes

Origine blog.csdn.net/sayWhat_sayHello/article/details/119334690
conseillé
Classement