你能给我一些关于对象头中到底存储了什么的信息吗?我知道,它可能依赖于JVM,但至少对HotSpot来说可能是这样?我正在寻找第一排的确切描述。
我读过一些信息,但我无法与我找到的信息正面核实。也许你有一个指向OpenJDK wiki的链接,它说明了一切?
对于热点:
对象标头由一个标记字和一个klass指针组成
标记字具有字大小(在32位体系结构上为4 byte
,在64位体系结构中为8 byte
)和
klass指针在CCD_ 3架构上具有字大小。在64 bit
体系结构上,klass指针要么具有字大小,但如果堆地址可以在这些4 bytes
中编码,则也可以具有4 byte
。
这种优化被称为"";压缩oops",您也可以使用选项UseCompressedOops
来控制它。
你也可以找到关于这个1的wiki条目。
标记词实际上用于许多事情。
- 一个是
Biased Locking
2,HotSpot通过它可以实现高效的锁定 - 它也在
GC to set forward pointers
和to store the age of the objects
期间使用。对象的身份散列码可以存储在标记内(System.identityHashCode
/Object.hashCode
)
markOop.hpp的源代码中有一条注释,描述了根据体系结构的布局:
// 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)
您也可以在这里找到oop头文件。
- 1https://wiki.openjdk.java.net/display/HotSpot/CompressedOops
- 2https://wiki.openjdk.java.net/display/HotSpot/Synchronization
您可以从HotSpot源中找到对象布局。
标头由markOop和指向instanceKlass的指针(或压缩指针)组成。
下面的演示为您提供了对象内容和对象标头的大致概念:http://www.slideshare.net/cnbailey/memory-efficient-java
任何对象的实际头都是JVM供应商、版本和对象类型特定的。