Java: ¿las matrices de 1-d son siempre contiguas en la memoria?

Muchos libros / artículos que he leído sobre este tema, así como un pequeño progtwig que escribí usando ‘Inseguro’, indican que las matrices de 1-d en Java siempre están contiguas en la memoria. Entonces, ¿lo dicta JLS o es una convención de implementación? La pregunta es para confirmar esta indicación.

No, la especificación de JVM no tiene ninguna de esas garantías: http://docs.oracle.com/javase/specs/jvms/se5.0/html/Concepts.doc.html#16446

En la práctica, probablemente sea el caso, pero tampoco tiene garantía sobre el tamaño de la palabra.

Inseguro no es una clase Java estándar, por lo que si su progtwig usa esto, entonces no es portátil de todos modos …

Como no existe una manera real de interactuar con las direcciones de memoria en Java, tampoco se define en la especificación cómo se ve el diseño del objeto en la memoria.

Tenga en cuenta que usar Unsafe casi automáticamente significa que está paseando fuera del ámbito de la especificación.

Una vez dicho esto, me atrevo a aventurar que la mayoría de las implementaciones de JVM utilizan un diseño lineal para matrices (unidimensionales).

Quiero actualizar esta pregunta con lo que la Especificación del lenguaje Java, la Edición Java SE 8 (JLS) y la Especificación de máquina virtual Java, Java SE 8 Edition (JVMS) dicen al respecto.

Tenemos que elegir para responder a esta pregunta:

  1. Qué restricciones se imponen a las implementaciones de JVM . Este es el enfoque más confiable porque la implementación de cualquier especificación presupone intrínsecamente el principio “Todo lo que no está prohibido está permitido” .
  2. Lo que la mayoría de las implementaciones de JVM sugieren razonable

Señalaré las restricciones de especificación.

Si miramos el Capítulo 10. Matrices de JLS (y cualquier otro capítulo de JLS y JVMS relacionado con matrices) no pudimos encontrar ninguna mención de las restricciones de diseño de memoria impuestas a las matrices. Por lo tanto, definitivamente significa que la matriz podría no ser continua .

Además, JLS dice que las matrices son Objetos :

Capítulo 10. Arrays.

En el lenguaje de progtwigción Java, las matrices son objetos (§4.3.1) , se crean dinámicamente y pueden asignarse a variables de tipo Objeto (§4.3.2). Todos los métodos de clase Object pueden invocarse en una matriz.

4.3.1. Objetos.

Un objeto es una instancia de clase o una matriz . (y Array es Object)

Y al mismo tiempo, JVMS dice que los objetos y matrices se almacenan en el montón:

2.5.3. Montón

Java Virtual Machine tiene un montón que se comparte entre todos los subprocesos de Java Virtual Machine. El montón es el área de datos en tiempo de ejecución a partir de la cual se asigna la memoria para todas las instancias de clase y matrices.

Pero JVMS no obliga a la memoria del montón a ser continua:

2.5.3. Montón

La memoria para el montón no necesita ser continua.

Como todas las matrices se almacenan en heap y heap puede que no sean continuas, se deduce que las matrices también pueden no ser continuas.

Dado que muchas JVM tienen un requisito de que el montón sea continuo en la memoria, creo que es poco probable que coloquen un conjunto 1d de primitivas en diferentes lugares de la memoria.

Es poco probable que el objeto al que hace referencia un Objeto [] sea continuo en la memoria e incluso si lo son, se puede reorganizar sin previo aviso.

Nota: Usando Unsafe puede leer referencias en una matriz como valores int para ver lo que son antes y después de un GC. Algunas JVM utilizan referencias de 64 bits que requieren una referencia larga, pero la mayoría usa 32-bti (incluso para las JVM de 64 bits)