[Java] Como visualizar o layout da memória de um objeto em Java

Insira a descrição da imagem aqui

1. Visão Geral

Alguns blogs dizem que o layout de memória do Java é dividido em 3 partes, então como podemos confirmar isso? Ou como imprimir o layout de memória de objetos java?

O seguinte descreve o uso desta classe

Primeiro apresente este pacote

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

Em seguida, crie uma classe

public class L {
    
    
    private boolean flag = false;
}

Então a classe de teste é a seguinte

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

Pode ser visto como segue

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

Analisando aqui, você pode ver que 3 object headercada ocupa 4 bytes, e então o booleano ocupa um byte. Estes totalizam 3 * 4 + 1 = 13 bytes, porque java requer objetos

  1. Pelo menos 8 bytes
  2. O objeto deve ser um múltiplo inteiro de 8

Portanto, os últimos 3 bytes são alinhados ao objeto.

Vamos verificar se criamos uma classe, mas é do tipo Int.

public class L {
    
    
    private int flag ;
}

Em seguida, execute a classe de teste e imprima da seguinte forma

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

Pode ser visto como segue

 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

Exatamente int ocupa 4 bytes e o resultado é exatamente 16 bytes, um múltiplo de 8, portanto, não há operação de preenchimento de objeto.

Acho que você gosta

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