Muchos libros/artículos que he leído sobre este tema, así como un pequeño programa 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.Java: ¿las matrices de 1-d están siempre contiguas en la memoria?
Respuesta
No, la especificación JVM no tiene ningún tipo de garantías: http://docs.oracle.com/javase/specs/jvms/se5.0/html/Concepts.doc.html#16446
En la práctica es probable que sea el caso, pero también hay ninguna garantía sobre el tamaño de la palabra.
inseguro no es una clase estándar de Java, así que si su programa utiliza esto, entonces no es portátil de todos modos ...
Dado que 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
prácticamente significa automáticamente que está paseando fuera del ámbito de la especificación.
Dicho esto, me atrevo a aventurar que la mayoría de las implementaciones de JVM hacen de hecho utilizan un diseño lineal para matrices (unidimensionales).
Dado que muchos de JVM tienen un requisito de que el montón es continua en la memoria, creo que es poco probable colocarán un conjunto 1d de primitivas en diferentes lugares de la memoria.
El objeto al que hace referencia un Objeto [] es poco probable que 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 int
valores 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)
Quiero actualizar esta pregunta con lo que dicen The Java Language Specification, Java SE 8 Edition (JLS) y The Java Virtual Machine Specification, Java SE 8 Edition (JVMS) al respecto.
Tenemos a las opciones para responder a esta pregunta:
- ¿Qué restricciones se imponen a las implementaciones de JVM. Este es el enfoque más confiable porque la implementación de cualquier especificación inherentemente presume de "Todo lo que no está prohibido está permitido" principio.
- Lo que la mayoría de las implementaciones de JVM sugieren razonable
voy a señalar a las limitaciones de especificación.
Si nos fijamos en Capítulo 10. Las matrices deJLS (y cualquier otros capítulos de JLS y JVM relacionados con arrays) no pudimos encontrar ninguna mención de las limitaciones impuestas a la capa de memoria matrices. Por lo tanto, definitivamente significa que la matriz podría no ser continua.
Por otra parte, JLS dice que las matrices son objetos :
Capítulo 10. Las matrices.
En el lenguaje de programación Java, matrices son objetos (§4.3.1), se crean dinámicamente y puede ser asignado a variables de tipo de objeto (§4.3.2). Todos los métodos de la clase Object pueden ser invocados en una matriz.
...4.3.1. Objetos.
un objeto es una instancia de clase o una matriz. (Y es objeto de matriz)
Y al mismo tiempo JVM dice que los objetos y las matrices se almacenan en el montón:
2.5.3. Heap
Java Virtual Machine tiene un montón compartido 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 JVM no obliga a la pila de memoria 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 el montón y montón podría ser no continua, se deduce que las matrices también pueden ser no continua.
Solo una nota: [¿Cuándo se debe usar el formato de código para el texto sin código?] (Http://meta.stackoverflow.com/a/254995) :). – Tom
¿Cómo haría las citas similares de las especificaciones oficiales? Quiero aislarlos de otro texto para una mejor lectura. – likern
Tenga en cuenta la diferencia entre "formato de código" y "blockquote". Palabras como "JLS", "JVMS" y "Capítulo 10. Arrays". no son códigos y deben formatearse como tales :). Las citas son correctas. – Tom
- 1. ¿Cómo las matrices 2D en C se convierten en matrices 1D?
- 2. java: matrices primitivas: ¿están inicializadas?
- 3. ¿Están ordenadas las matrices asociativas de PHP?
- 4. ¿Ventana giratoria para matrices 1D en Numpy?
- 5. ¿Las matrices de JavaScript en realidad están vinculadas?
- 6. Java: cómo funcionan las matrices
- 7. Uso de la memoria Python de las matrices numpy
- 8. ¿Cómo funcionan las plantillas? ¿Están siempre en línea?
- 9. ¿Siempre revisa la memoria malloc'ed?
- 10. Identificar regiones contiguas en la matriz numpy 2D
- 11. En C++, ¿en qué memoria están las funciones de clase?
- 12. ¿Cómo se formatean matrices multidimensionales en la memoria?
- 13. ¿Cómo se implementan las matrices en Java?
- 14. ¿Cómo se implementa la longitud en las matrices de Java?
- 15. ¿Cómo almacenar valores en ubicaciones de memoria no contiguas con intromisión de SSE?
- 16. ¿Están las matrices de cadenas en línea en C asignadas en la pila?
- 17. Evite la fragmentación de la memoria al asignar muchas matrices en Java
- 18. ¿Las propiedades siempre tienen un valor cuando están desactivadas?
- 19. En caso de que las matrices Clojure sean tan rápidas como las matrices Java
- 20. ¿Las matrices de primitivas "distintas de cero" requieren más memoria?
- 21. Implementación eficiente de matrices multidimensionales en Java?
- 22. ¿Los punteros siempre están configurados como nulos en la declaración?
- 23. Lista de matrices en Java
- 24. Imprimir matrices en Java
- 25. ¿Están todos los archivos .class en mi aplicación Java cargados en la memoria después del inicio de la aplicación?
- 26. ¿Por qué anida para siempre la memoria?
- 27. ¿Están las propiedades de Java en desuso de manera efectiva?
- 28. ¿Son seguras las matrices de Java en un método estático?
- 29. memoria eficientes en Java
- 30. ¿Dónde están almacenadas las preferencias de Java en Windows 7?
de acuerdo, pero la matriz en sí será contigua, ¿verdad? algo así: 1000-> aa, 1001-> bb, 1002-> cd, etc. – shrini1000
Espero que las referencias se almacenen continuamente (pero no creo que se especifique en ningún lugar) Esto es similar al hecho de que el Spec no dice que el recuento de referencias no se utilizará para GC en ninguna JVM, pero AFAIK no lo hará. –
@ shrini1000 si el montón no es un bloque contiguo de memoria virtual, entonces una matriz que abarque dos fragmentos NO tendrá un diseño contiguo. Por otro lado, el montón que es contiguo no implica nada sobre que las matrices lo sean también, tal vez solo indirectamente lo hace más probable ya que las restricciones de diseño de GC serían similares. –