una - variable objeto java
Qué está en el encabezado del objeto java (3)
La siguiente presentación le da una idea general de los contenidos del objeto y el encabezado del objeto: http://www.slideshare.net/cnbailey/memory-efficient-java
El encabezado real de cualquier objeto es el proveedor de JVM, la versión y el tipo de objeto específico.
¿Podría darme alguna información sobre lo que se almacena exactamente en el encabezado del objeto? Lo sé, es probable que sea dependiente de JVM, ¿pero tal vez para HotSpot al menos? Estoy buscando una descripción exacta específicamente para una primera fila.
He leído información que no puedo verificar positivamente con la información que encuentro. ¿Tal vez tienes un enlace a la wiki de OpenJDK que lo dice todo?
Puede encontrar el diseño del objeto desde las fuentes de HotSpot .
El encabezado consiste en markOop seguido de un puntero (o puntero comprimido) para instanceKlass .
Para HotSpot:
El encabezado del objeto consiste en una palabra de marca y un puntero de klass.
La palabra de marca tiene tamaño de palabra ( 4 byte
en arquitecturas de 32 bits, 8 byte
en arquitecturas de 64 bits) y
el puntero klass tiene tamaño de palabra en arquitecturas de 32 bit
. En 64 bit
arquitecturas de 64 bit
, el puntero de klass tiene un tamaño de palabra, pero también puede tener 4 byte
si las direcciones del montón se pueden codificar en estos 4 bytes
.
Esta optimización se denomina "oops comprimidos" y también puede controlarla con la opción UseCompressedOops
.
También puedes encontrar una entrada wiki sobre esto 1 .
La palabra de marca se usa realmente para muchas cosas.
- Uno es
Biased Locking
2 través del cual HotSpot puede implementar un bloqueo eficiente. - También se usa durante
GC to set forward pointers
yto store the age of the objects
. El código hash de identidad de un objeto se puede almacenar dentro de la marca (System.identityHashCode
/Object.hashCode
one).
Hay un comentario en el código fuente de 1 que describe el diseño dependiendo de la arquitectura:
// 32 bits:
// --------
// hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object)
// JavaThread*:23 epoch:2 age:4 biased_lock:1 lock:2 (biased object)
// size:32 ------------------------------------------>| (CMS free block)
// PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)
//
// 64 bits:
// --------
// unused:25 hash:31 -->| unused:1 age:4 biased_lock:1 lock:2 (normal object)
// JavaThread*:54 epoch:2 unused:1 age:4 biased_lock:1 lock:2 (biased object)
// PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object)
// size:64 ----------------------------------------------------->| (CMS free block)
//
// unused:25 hash:31 -->| cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && normal object)
// JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && biased object)
// narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object)
// unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block)
También puede encontrar el archivo de encabezado de oop 2 .