Mientras que en muchas máquinas virtuales el tamaño de una referencia es el tamaño del puntero nativo (es decir, 32 bits para una JVM de 32 bits y 64 bits para una JVM de 64 bits), esto no está garantizado, y HotSpot lo hace ahora o pronto será compatible con "Compressed Oops" que son referencias de 32 bits en una JVM de 64 bits. (Eso no significa que cada referencia está comprimida; lea el artículo vinculado para obtener más información, y también hay muchas publicaciones en el blog sobre esto)
En respuesta a otro comentario, tenga en cuenta que la referencia es típicamente solo una forma de abordar el objeto en sí. Ya sea que se trate de un puntero de memoria directa o no, su objetivo es llegar a los datos para el objeto. Eso es básicamente todo lo que importa realmente. Si hay algunos bits "de reserva" (por ejemplo, es una referencia de 64 bits y no necesita todo ese ancho solo para representar la ubicación del objeto), la VM puede usar esos datos para otra información, como su tipo, que puede permitir algunas optimizaciones (Consulte el comentario de Tom para obtener más detalles.)
El objeto en sí contiene información de tipo (probablemente en forma de una referencia a la instancia de Class
, o algo similar, no sé con suficiente detalle), así como "cosas" necesarias en el encabezado, antes de llegar a los datos del usuario para el objeto.
32 bits no parece mucho si incluye la información del tipo? –
@pqism: la referencia en sí es probablemente solo un puntero al objeto real.La información de tipo se almacenará con el resto de los datos del objeto. Tal vez una mejor pregunta sería "¿cuál es el tamaño mínimo para un objeto Java, y qué contiene?" –
¿De acuerdo, porque después de la compilación ya no nos importa el tipo declarado? Entonces, realmente es solo "algo en esa dirección". –