Mixalis Navridis:
Todo lo que vienen con una simple pregunta. De acuerdo con la documentación de Java y muchos artículos acerca de la disposición objeto de memoria java si tenemos una clase con una int
variable de consumo total de memoria para ese objeto será:
- 8 bytes para el encabezado
- 4 bytes para la int
- 4 acolchado byte (a la vuelta de la hasta total de que sea múltiplo de 8 bytes) = 16 bytes en total
public class Ab {
int b;
}
public static void main(String args[]) throws InterruptedException {
Ab ab = new AB();
}
Mi problema ahora es que cuando he usado el Visual VM y la mirada en el volcado de pila para observar este enfoque teórico me di cuenta que el consumo de memoria para ese objeto era 20 bytes en lugar de 16 ? ¿Por qué sucede esto? ¿Puede alguien explicar a mí?
Oleksandr Pyrohov:
Utilizando el diseño de objetos de Java herramienta recibí el siguiente resultado:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 4 int Ab.b N/A
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
Y con la -XX:-UseCompressedOops
opción de VM (desactivar las referencias comprimidas):
OFFSET SIZE TYPE DESCRIPTION VALUE
0 16 (object header) N/A
16 4 int Ab.b N/A
20 4 (loss due to the next object alignment)
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
entorno Java:
java version "11" 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11+28)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11+28, mixed mode)