web-dev-qa-db-fra.com

Contenu de l'en-tête d'objet Java

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?

40
alobodzk

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.

  1. L'un est Biased Locking2 à travers lequel HotSpot peut implémenter un verrouillage efficace.
  2. Il est également utilisé pendant 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 .

48
box

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.

3
Chris Bailey

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 .

2
apangin