variable Qu'est-ce que l'en-tête de l'objet Java?




variable de classe java (3)

Pouvez-vous me donner des informations sur ce qui est exactement stocké dans l'en-tête de l'objet? Je sais que cela dépend probablement de la JVM, mais peut-être au moins pour HotSpot? Je cherche la description exacte spécifiquement pour une première rangée.

J'ai lu plusieurs informations que je ne peux pas vérifier de manière positive avec les informations que je trouve. Peut-être que vous avez un lien vers le wiki OpenJDK qui dit tout?


Pour HotSpot:

L'en-tête d'objet est constitué d'un mot-clé et d'un pointeur de classe.

Le mot de marque a une taille de mot ( 4 byte sur les architectures 32 bits, 8 byte sur les architectures 64 bits) et

le pointeur klass a une taille de mot sur 32 bit architectures 32 bit . Sur 64 bit architectures 64 bit , le pointeur klass a soit une taille de mot mais peut aussi avoir 4 byte si les adresses de segment peuvent être codées dans ces 4 bytes .

Cette optimisation est appelée "oops compressés" et vous pouvez également la contrôler avec l'option UseCompressedOops .

Vous pouvez également trouver une entrée wiki à ce sujet 1 .

Le mot -clé est effectivement utilisé pour beaucoup de choses.

  1. L'un d'entre eux est le Biased Locking 2 par lequel HotSpot peut implémenter un verrouillage efficace.
  2. Il est également utilisé lors du GC to set forward pointers et to store the age of the objects . Le code de hachage d'identité d'un objet peut être stocké dans la marque (celui de System.identityHashCode / Object.hashCode ).

Il y a un commentaire dans le code source de 1 qui décrit la mise en page en fonction de l'architecture:

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

Vous pouvez également trouver le fichier d'en-tête oop 2 .



Vous pouvez trouver la disposition de l'objet à partir des sources HotSpot .

L'en-tête est composé de markOop suivi d'un pointeur (ou d'un pointeur compressé) sur instanceKlass .







jvm