¿Dónde se almacena la longitud de la matriz en JVM?

1. Información general

En este tutorial rápido, veremos cómo y dónde el HotSpot JVM almacena la longitud de la matriz.

Por lo general, el diseño de la memoria de las áreas de datos en tiempo de ejecución no forma parte de la especificación JVM y se deja a discreción del implementador. Por lo tanto, cada implementación de JVM puede tener una estrategia diferente para distribuir objetos y arreglos en la memoria.

En este tutorial, nos centraremos en una implementación de JVM específica: HotSpot JVM. También podemos usar los términos JVM y HotSpot JVM de manera intercambiable.

2. Dependencia

Para inspeccionar el diseño de memoria de las matrices en la JVM, usaremos la herramienta Java Object Layout (JOL). Por lo tanto, necesitamos agregar la dependencia jol-core :

 org.openjdk.jol jol-core 0.10 

3. Longitud de la matriz

HotSpot JVM utiliza una estructura de datos denominada Ordinary Object Pointers (OOP) para representar punteros a objetos. Para ser más específico, HotSpot JVM representa los arreglos con un OOP especial llamado arrayOop . Cada arrayOop incluye un encabezado de objeto con los siguientes detalles:

  • Una palabra de marca para almacenar el código hash de identidad o la información de GC
  • Una palabra klass para almacenar metadatos de clases generales
  • 4 bytes que representan la longitud de la matriz

Por lo tanto, la JVM almacena la longitud de la matriz en el encabezado del objeto .

Verifiquemos esto inspeccionando el diseño de memoria de una matriz:

int[] ints = new int[42]; System.out.println(ClassLayout.parseInstance(ints).toPrintable());

Como se muestra arriba, estamos analizando el diseño de la memoria de una instancia de matriz existente. Así es como la JVM presenta el int [] :

[I object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1) # mark 4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0) # mark 8 4 (object header) 6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363) #klass 12 4 (object header) 2a 00 00 00 (00101010 00000000 00000000 00000000) (42) # array length 16 168 int [I. N/A Instance size: 184 bytes

Como se mencionó anteriormente, la JVM almacena la longitud de la matriz dentro del encabezado del objeto después de las palabras mark y klass. Además, la longitud de la matriz se almacenará en 4 bytes, por lo que no puede ser mayor que el valor máximo para un entero de 32 bits.

Después del encabezado del objeto, la JVM almacena los elementos reales de la matriz. Como tenemos una matriz de 42 enteros, el tamaño total de la matriz es 168 bytes, 42 multiplicado por 4.

4. Conclusión

En este breve tutorial, vimos cómo la JVM almacena la longitud de la matriz.

Como de costumbre, todos los ejemplos están disponibles en GitHub.