Cosa c’è nell’intestazione dell’object java

Potresti darmi qualche informazione su cosa è esattamente memorizzato nell’intestazione dell’object? Lo so, è probabilmente dipendente da JVM, ma forse almeno per HotSpot? Sto cercando una descrizione esatta per una prima riga.

Ho letto diverse informazioni che non posso verificare in modo positivo con le informazioni che trovo. Forse hai un link al wiki OpenJDK che dice tutto?

Per HotSpot:

L’intestazione dell’object è composta da una parola chiave e un puntatore klass.

La parola mark ha dimensione word ( 4 byte su architetture a 32 bit, 8 byte su architetture a 64 bit) e

il puntatore klass ha una dimensione di parola su architetture a 32 bit . Su architetture 64 bit il puntatore klass ha o meno la dimensione della parola, ma può anche avere 4 byte se gli indirizzi heap possono essere codificati in questi 4 bytes .

Questa ottimizzazione si chiama “compresso oops” e puoi anche controllarla con l’opzione UseCompressedOops .

Puoi anche trovare una voce wiki a riguardo 1 .

La parola chiave è effettivamente usata per molte cose.

  1. Uno è Biased Locking 2 tramite il quale HotSpot può implementare un blocco efficiente.
  2. Viene anche utilizzato durante GC to set forward pointers e to store the age of the objects . Il codice hash di identity framework di un object può essere memorizzato all’interno del marchio (quello System.identityHashCode / Object.hashCode ).

C’è un commento nel codice sorgente di markOop.hpp che descrive il layout in base all’architettura:

 // 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) 

Puoi anche trovare il file di intestazione oop qui .

La seguente presentazione offre un’idea generale del contenuto dell’object e dell’intestazione dell’object: http://www.slideshare.net/cnbailey/memory-efficient-java

L’intestazione effettiva per qualsiasi object è il fornitore JVM, la versione e il tipo di object specifico.

È ansible trovare il layout dell’object dalle origini HotSpot .

L’intestazione è composta da markOop seguito da un puntatore (o puntatore compresso) in instanceKlass .