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 header
cada uno ocupa 4 bytes, y luego el booleano ocupa un byte. Estos totalizan 3 * 4 + 1 = 13 bytes, porque java requiere objetos
- Al menos 8 bytes
- 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.