¿Por qué un tipo de referencia en java toma 8 bytes? ¿Por qué no menos o más de 8 bytes?tamaño de tipo de referencia en java
Respuesta
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.
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.
Los valores de la referencia de tipo se pueden considerar como punteros a los objetos. el byte 8 debe abordar esto en el montón.
leer sobre The Structure of the Java Virtual Machine
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.
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
Gracias por la corrección ... ¿tiene un enlace a la documentación relevante? –
http://stackoverflow.com/a/17814352/829571 contiene enlaces – assylias
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.
- 1. Tipo de objeto en Java y matrices de referencia
- 2. adelante Referencia del Tipo de parámetro en Java Generics
- 3. Java - Variables de referencia
- 4. tipo de valor tipo de objeto de referencia en javascript
- 5. tamaño de tipo char en C
- 6. tamaño del tipo de caracteres en C#
- 7. conjunto de referencia de objeto en java
- 8. mongodb nodo de referencia de tipo
- 9. ¿Cuál es el tipo de referencia entero en C#?
- 10. Propiedades de tipo anónimo de referencia
- 11. Convierta el tipo de referencia C# al tipo de referencia no por correspondencia
- 12. ¿Mantiene la referencia a cualquier tipo de objeto en C++?
- 13. Java y tamaño de referencia exacto para objetos, matriz y tipos primitivos
- 14. Tipo de referencia no puede encontrar el tipo público llamado
- 15. java copia de referencia nula
- 16. Mejor práctica para obtener el tamaño de tipo de datos (sizeof) en Java
- 17. Genérico Tipo de referencia error Monotouch
- 18. Cómo obtener el tipo de la referencia?
- 19. ¿Cómo cambiar el tamaño de la imagen original en un tamaño de imagen común en Java?
- 20. pase de Java por referencia
- 21. Java referencia de clase generized
- 22. Genéricos C#: tipo de referencia vs. valor
- 23. Tamaño de pila retenido de una cadena en java
- 24. ¿Interfaz como tipo en Java?
- 25. referencia directa ilegal en java
- 26. Tipo de referencia con espacio de nombre parcialmente calificado
- 27. Tipo de datos de tamaño de bit arbitrario en C#
- 28. Pasando por referencia en Java?
- 29. Tamaño de clave AES en Java
- 30. ¿Tamaño máximo de un método en Java?
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. –