¿Cuál es el tamaño de una variable de referencia en Java? ¿Se puede calcular?
9
Como los punteros en C requieren 2 bytes de tamaño de memoria, independientemente del tamaño del tipo de datos al que apuntan. Entonces, ¿se aplica lo mismo a las referencias de Java también?
en arquitecturas modernas (64 bits) C requiere 8 bytes para un puntero, Java usa 4 u 8 dependiendo de la implementación subyacente (pero puede ser cualquier cosa siempre que se conserve la semántica)
Con C, también depende completamente de la implementación. ¡Puede compilar para 32 bits (x86 simple) y obtener punteros de 4 bytes, o puede usar instrucciones y registros de 64 bits pero punteros de 4 bytes (ABI x32)!
La especificación del lenguaje Java no dice nada sobre cuán grande es una referencia en la memoria. El JLS ni siquiera dice que una referencia debe existir en tiempo de ejecución . El compilador es libre de usar 42 gigabytes como referencia o para eliminarlo por completo, con un tamaño de 0 bytes. (De hecho, la Especificación del lenguaje Java nunca dice nada sobre una estrategia o representación de implementación particular, solo especifica la sintaxis y la semántica de las construcciones del lenguaje Java, no su pragmática).
La mayoría de las implementaciones de Java típicas simplemente implementarán referencias como punteros, lo que los hará del mismo tamaño que en C. A veces, estas referencias se denominan OOP (punteros de objetos ordinarios). Pero Oracle Jotspot JVM, por ejemplo, tiene una característica llamada CompressedOOPs, que puede hacer algunas referencias más pequeñas que los punteros C en sistemas de 64 bits.
Debido a la -XX:+UseCompressedOopsopción JVM HotSpot , las referencias a objetos son de 8 bytes.
Permite el uso de punteros comprimidos (referencias de objeto representadas como compensaciones de 32 bits en lugar de punteros de 64 bits) para un rendimiento optimizado de 64 bits con tamaños de almacenamiento dinámico Java de menos de 32 gb.
Podemos probar esto agregando una referencia a una clase vacía y midiendo su uso de memoria. Esto muestra 24 bytes utilizados en el montón. Agregue una primitiva "byte" más, vuelva a medir y verá 32 bytes de uso de almacenamiento dinámico.
Respuestas:
La especificación del lenguaje Java no dice nada sobre cuán grande es una referencia en la memoria. El JLS ni siquiera dice que una referencia debe existir en tiempo de ejecución . El compilador es libre de usar 42 gigabytes como referencia o para eliminarlo por completo, con un tamaño de 0 bytes. (De hecho, la Especificación del lenguaje Java nunca dice nada sobre una estrategia o representación de implementación particular, solo especifica la sintaxis y la semántica de las construcciones del lenguaje Java, no su pragmática).
La mayoría de las implementaciones de Java típicas simplemente implementarán referencias como punteros, lo que los hará del mismo tamaño que en C. A veces, estas referencias se denominan OOP (punteros de objetos ordinarios). Pero Oracle Jotspot JVM, por ejemplo, tiene una característica llamada CompressedOOPs, que puede hacer algunas referencias más pequeñas que los punteros C en sistemas de 64 bits.
fuente
Debido a la
-XX:+UseCompressedOops
opción JVM HotSpot , las referencias a objetos son de 8 bytes.Podemos probar esto agregando una referencia a una clase vacía y midiendo su uso de memoria. Esto muestra 24 bytes utilizados en el montón. Agregue una primitiva "byte" más, vuelva a medir y verá 32 bytes de uso de almacenamiento dinámico.
fuente