Java obtiene la dirección de memoria de un objeto

prefacio

Sabemos que en Java, synchronizedel objeto de instancia actual está bloqueado para el método de sincronización.
Por ejemplo, el siguiente fragmento de código:

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();
        }
    }
}

Después de descargar, podemos obtener la siguiente información:

"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)

La dirección de memoria de la prueba de instancia de Test es <0x09db48c0>. ¿Cómo verificamos que esta dirección es nuestra dirección de memoria?

texto

Introducir dependencias

Agregue dependencias en pom.xml:

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

usar

Es fácil de usar:

VM.current().addressOf(test)

Ponerlo en nuestro código es:

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();
        }
    }
}

En la consola podemos ver la salida:

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

en conclusión

Introduciendo org.openjdk.jolpodemos obtener rápidamente la dirección de memoria del objeto. Una mirada general al código fuente relevante muestra que la capa inferior se unsafejuzga usando clases.

JOL (Java Object Layout) es la pequeña caja de herramientas para analizar esquemas de diseño de objetos en JVM. Estas herramientas utilizan en gran medida Unsafe, JVMTI y Serviceability Agent (SA) para decodificar el diseño, el espacio y las referencias reales del objeto. Esto hace que JOL sea mucho más preciso que otras herramientas que se basan en volcados de almacenamiento dinámico, suposiciones de especificación, etc.

(Java Object Layout) es una pequeña caja de herramientas para analizar esquemas de diseño de objetos en jvm. Estas herramientas hacen un uso intensivo de Unsafe, JVMTI y Serviceability Agent (SA) para decodificar el diseño real del objeto, el espacio de memoria y las referencias. Esto hace que JOL sea más preciso que otras herramientas que se basan en volcados de almacenamiento dinámico, suposiciones de especificación, etc.

Supongo que te gusta

Origin blog.csdn.net/sayWhat_sayHello/article/details/119334690
Recomendado
Clasificación