[Java] Cómo ver el diseño de la memoria de un objeto en Java

Inserte la descripción de la imagen aquí

1. Información general

Algunos blogs dicen que el diseño de la memoria de Java se divide en 3 partes, entonces, ¿cómo confirmamos esto? ¿O cómo imprimir el diseño de memoria de los objetos java?

A continuación se describe el uso de esta clase.

Primero presenta este paquete

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

Luego, crea una clase

public class L {
    
    
    private boolean flag = false;
}

Entonces la clase de prueba es la siguiente

    @Test
    public void printAble(){
    
    
        L l = new L();
        System.out.println(ClassLayout.parseInstance(l).toPrintable());
    }

Puede verse de la siguiente manera

com.java.lock.obj.head.L object internals:
 OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
      0     4           (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4           (object header)                           a3 1c 01 f8 (10100011 00011100 00000001 11111000) (-134144861)
     12     1   boolean L.flag                                    false
     13     3           (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 3 bytes external = 3 bytes total

Analizando aquí, puede ver que 3 object headercada uno ocupa 4 bytes, y luego el booleano ocupa un byte. Estos totalizan 3 * 4 + 1 = 13 bytes, porque java requiere objetos

  1. Al menos 8 bytes
  2. El objeto debe ser un múltiplo entero de 8

Por lo tanto, los últimos 3 bytes están alineados con el objeto.

Verifiquemos que creamos una clase, pero es de tipo Int.

public class L {
    
    
    private int flag ;
}

Luego ejecute la clase de prueba e imprima de la siguiente manera

 @Test
    public void printAble(){
    
    
        L l = new L();
        System.out.println(ClassLayout.parseInstance(l).toPrintable());
    }

Puede verse de la siguiente manera

 OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4        (object header)                           a3 1c 01 f8 (10100011 00011100 00000001 11111000) (-134144861)
     12     4    int In.flag                                   0
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

Exactamente int ocupa 4 bytes y el resultado es exactamente 16 bytes, un múltiplo de 8, por lo que no hay operación de llenado de objetos.

Supongo que te gusta

Origin blog.csdn.net/qq_21383435/article/details/110727931
Recomendado
Clasificación