Pourriez-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 pour HotSpot au moins? Je cherche une description exacte spécifiquement pour une première rangée.
J'ai lu plusieurs informations que je ne peux pas vérifier positivement 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 de l'objet se compose d'une marque Word et d'un pointeur klass.
La marque Word a la taille Word (4 byte
sur les architectures 32 bits, 8 byte
sur les architectures 64 bits) et
le pointeur klass a la taille Word sur 32 bit
architectures. Sur 64 bit
architectures, le pointeur klass a la taille d'un mot, mais peut également avoir 4 byte
si les adresses de tas peuvent être encodées dans ces 4 bytes
.
Cette optimisation est appelée "oups compressé" et vous pouvez également la contrôler avec l'option UseCompressedOops
.
Vous pouvez également trouver une entrée wiki à ce sujet 1 .
La marque Word est en fait utilisée pour de nombreuses choses.
Biased Locking
2 à travers lequel HotSpot peut implémenter un verrouillage efficace.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é à l'intérieur de la marque (le System.identityHashCode
/Object.hashCode
un).Il y a un commentaire dans le code source de markOop.hpp qui décrit la disposition 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 ici .
La présentation suivante vous donne une idée générale du contenu et de l'en-tête de l'objet: http://www.slideshare.net/cnbailey/memory-efficient-Java
L'en-tête réel pour tout objet est spécifique au fournisseur JVM, à la version et au type d'objet.
Vous pouvez trouver la disposition des objets dans sources HotSpot .
L'en-tête se compose de markOop suivi d'un pointeur (ou pointeur compressé) sur instanceKlass .