2011-03-18 22 views

Respuesta

4

Esto se debe a que una variable de referencia no retiene el objeto. Es una forma de alcanzar el objeto. La forma en que JVM maneja esto es algo de lo que menos nos preocupamos. Puede pensarlo como una dirección en la ubicación del objeto en el montón. Pero no tiene que ser tan sencillo como una dirección.

+0

De hecho, probablemente no pueda, ya que el GC mueve mucho los objetos en la memoria física, por lo que la JVM necesita un nivel adicional de direccionamiento indirecto para mantener las referencias actualizadas. –

0

8 Bytes es el tamaño de una variable larga en Java y permite referenciar 1.01457092 × 10^19 referencias, eso debería ser suficiente para la mayoría de las aplicaciones, y más grande que la mayoría de discos duros puede abordar teniendo en cuenta que cada referencia puntos tiene que mantener también los datos ...

Editar: Después de leer una de las otras respuestas que quería aclarar que la referencia es sólo un puntero a los datos y no contiene los datos, los arquitectos de Java decidió usar valores de 64 bits para denotar referencias porque le da un gran espacio de direcciones.

9

En realidad, se especifica en ninguna parte la cantidad de bytes de una variable de referencia tendrá una, y de hecho, no es igual en todas partes.

máquinas virtuales común para los sistemas de 32 bits (es decir, sistemas con 32 direcciones de bits en el bus de memoria) suelen utilizar 32 bits (= 4 bytes, lo mismo que int y float) como el tamaño de las referencias a objetos, mientras que las máquinas virtuales para los sistemas de 64 bits a menudo usan el tamaño de la dirección nativa de 64 bits (= 8 bytes) para estos. (Tenga en cuenta que la mayoría de los sistemas de 64 bits también pueden ejecutar programas de 32 bits, por lo que a menudo incluso utilizará una máquina virtual de 32 bits).

Es simplemente una cuestión de simplificar la implementación, si puede usar una la dirección de memoria real para sus referencias en lugar de otra cosa.

ya que esto aumenta el tamaño de memoria utilizada (y muchas veces no necesita realmente para acceder que la cantidad de memoria), el from Java 7 on 64 bits HotSpot VM podrán utilizar referencias de 32 bits bajo ciertas condiciones, es decir, cuando el montón es menor que 32 GB (8 · 2 bytes). Para convertirlos a una dirección de memoria real, se multiplican por 8 (ya que los objetos se alinearán en límites de 8 bytes) y luego se agregan a la dirección base (si no es cero). (Para montones de menos de 4 GB, no necesitamos el paso de multiplicación.)

Otras máquinas virtuales pueden usar trucos similares.

+0

Las JVM de 64 bits no necesariamente usan referencias de 64 bits. El punto de acceso, por ejemplo, usa 32 bits de forma predeterminada. – assylias

+0

Gracias por la corrección ... ¿tiene un enlace a la documentación relevante? –

+0

http://stackoverflow.com/a/17814352/829571 contiene enlaces – assylias

2

te voy a dar un ejemplo para ayudar a entender mejor el punto

String myName = new String("John"); 
    String yourName = new String("John"); 
    if (myName == yourName) 
    { 
     System.out.println("Refereces point to Same objects on heap"); 
    } else 
    { 
     System.out.println("Refereces point to different objects on heap"); 
    } 

y la salida es Refereces a diferentes objetos en el montón.

Aquí myName y Yourname son dos referencias que apuntan a objetos de tipo String (memoria asignada en el montón). La memoria de notas para las variables de referencia se asigna en pila y no en el Heap.Ambas variables de referencia simplemente tienen la dirección (o abstracción única similar) del objeto String que reside en el Heap. El tamaño de la dirección será constante para una arquitectura particular de sistema operativo. En el caso de 32 bits, será de 4 bytes, mientras que para 64 bits será de 8 bytes.

Por lo tanto, el tamaño de los objetos apuntados puede variar, pero el tamaño de las referencias sigue siendo el mismo ya que simplemente llevan una dirección que permanece constante para cualquier arquitectura en particular.

Cuestiones relacionadas