Calcular el uso de la memoria de los objetos Java con VisualVM Heap Dump no coincide con el enfoque teórico

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 intvariable 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:-UseCompressedOopsopció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)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=119390&siteId=1
Recomendado
Clasificación