2014-10-14 11 views
27

Könnten Sie mir einige Informationen darüber geben, was genau in Objektkopf gespeichert ist? Ich weiß, dass es wahrscheinlich JVM-abhängig ist, aber zumindest für HotSpot? Ich suche eine genaue Beschreibung speziell für eine erste Zeile.Was ist in Java Objektkopf

Ich habe mehrere Informationen gelesen, die ich mit Informationen, die ich finde, nicht positiv verifizieren kann. Vielleicht haben Sie einen Link zum OpenJDK-Wiki, das alles sagt?

Antwort

31

Für HotSpot:

Der Objekt-Header besteht aus einem Zeichen Wort und einem klass Zeiger.

Die Zeichen Wort hat Wortgrße (4 byte auf 32-Bit-Architekturen, 8 byte auf 64-Bit-Architekturen) und

die Klass Zeiger Wortgröße auf 32 bit Architekturen hat. Auf 64 bit Architekturen der Klasse Zeiger hat entweder Wortgröße, kann aber auch 4 byte haben, wenn die Heap-Adressen in diesen 4 bytes codiert werden können.

Diese Optimierung heißt "komprimiert oops" und Sie können es auch mit der Option UseCompressedOops steuern.

Sie können auch einen Wiki-Eintrag über diese 1 finden.

Das Markenwort wird tatsächlich für viele Dinge verwendet.

  1. Eine davon ist Biased Locking2, über die HotSpot effizientes Sperren implementieren kann.
  2. Es wird auch während GC to set forward pointers und to store the age of the objects verwendet. Der Identitäts-Hash-Code eines Objekts kann innerhalb der Marke gespeichert werden (System.identityHashCode/Object.hashCode).

Es ist ein Kommentar im Quellcode von markOop.hpp, die das Layout von der Architektur abhängig beschreibt:

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

Sie können auch die oop-Header-Datei here finden.

+3

"oop" steht für * gewöhnlichen Objektzeiger * – user2418306