¿Qué tan grande es una referencia de objeto en Java y, precisamente, qué información contiene?

Como progtwigdor, pienso que estos se parecen a “java.lang.Object en la dirección 1a234552″ o similar para algo como s en

 Object s = "hello"; 

¿Es esto correcto? Por lo tanto, ¿todas las referencias son de tamaño fijo?

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, en particular, HotSpot ahora o ahora admitirá ” Compressed Oops ” que son referencias de 32 bits en una JVM de 64 bits. (Eso no significa que todas las referencias estén comprimidas; 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 en sí misma suele ser solo una forma de abordar el objeto en sí. Ya sea que se trate de un puntero de memoria directa o no, su objective es llegar a los datos para el objeto. Eso es básicamente todo lo que realmente importa. 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 (Ver el comentario de Tom para 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 otras “cosas” necesarias en el encabezado, antes de llegar al datos de usuario para el objeto.

No es parte de JLS o JVM Spec, pero en la práctica será una dirección: 32 bits en la CPU de 32 bits, 64 en 64.

pqism: Ok, te tengo, porque después de la comstackción ya no nos importa el tipo declarado?

Nos importa Es por eso que los objetos de Clase están ahí. De hecho, a partir de las otras respuestas, puede ver que nos preocupamos por los tipos en tiempo de ejecución lo suficiente como para optimizar la forma en que trabajamos con ellos poniendo como referencia parte de la información tipo.

El tamaño de una referencia de objeto depende de la JVM y la architecture de la máquina. En general, en una máquina de 32 bits es de 32 bits y en una máquina de 64 bits es de 64 bits. Sin embargo, creo que OpenJDK 7 JVM tendrá soporte para “punteros comprimidos” que ahorrarán espacio en máquinas de 64 bits.

La información sobre el tipo del objeto se almacena en el objeto mismo; es decir, si sigue el puntero de 32 bits o de 64 bits (o, más probablemente, maneja) al objeto, encontrará otro puntero a una instancia de Class que describa el tipo, así como los campos de datos del objeto .

La mayoría de las personas tienden a ver una referencia a un objeto como un puntero de memoria similar al lenguaje C. Si bien esto no es técnicamente correcto, la mayoría de las implementaciones lo implementan como un puntero. En el caso de punteros de objetos comprimidos, por ejemplo, la JVM almacena solo los bits 3 a 34 del puntero de 64 bits en una plataforma de 64 bits. Otras implementaciones también podrían optar por utilizar un esquema diferente: la referencia podría ser un índice en una matriz de punteros que contenga todos los objetos.