2009-06-11 15 views

Respuesta

9

No es una parte de JLS o JVM Spec, pero en la práctica habrá una dirección de 32 bit en bit CPU 32, 64 a 64.

pqism: Está bien tienes, porque después de la compilació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.

+1

32 bits no parece mucho si incluye la información del tipo? –

+2

@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?" –

+0

¿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". –

52

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.

+2

Azul pon algo de información de tipo en el oop. IIRC, se usan 48 bits para la dirección y 16 para la información del tipo (podría estar ligeramente por ahí, particularmente si algunos de los bits en la parte inferior de los 48 son siempre cero). Creo que esto permite una comprobación rápida de las llamadas a métodos virtuales no megamórficas y en línea. –

+0

Cool - se actualizará. –

+0

¿Qué otra memoria está almacenada? Por ejemplo: tipo de objeto, información de lanzamiento, información polimórfica, etc. No sé si esto está almacenado en el "encabezado" del Objeto, pero ¿tiene idea de qué más se almacena de un objeto aparte de sus referencias? – santiagobasulto

2

La mayoría de las personas tienden a ver una referencia a un objeto como un puntero de memoria de 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.

+0

¿Quiere decir que el JLS no ** prohíbe ** otras formas de almacenar referencias de objeto (además del modo C-language-like-memory-pointer)? – Pacerier

2

El tamaño de una referencia de objeto depende de la JVM y de la arquitectura 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 .

Cuestiones relacionadas