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?
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?
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.
Debido a la -XX:+UseCompressedOops opció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.