2012-04-19 5 views

Respuesta

15

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 ...

10

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).

3

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)

+2

de acuerdo, pero la matriz en sí será contigua, ¿verdad? algo así: 1000-> aa, 1001-> bb, 1002-> cd, etc. – shrini1000

+1

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á. –

+3

@ 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. –

8

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:

  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 inherentemente presume de "Todo lo que no está prohibido está permitido" principio.
  2. 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.

+0

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

+0

¿Cómo haría las citas similares de las especificaciones oficiales? Quiero aislarlos de otro texto para una mejor lectura. – likern

+0

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

Cuestiones relacionadas