什么是Java对象标头
你能给我一些有关对象头中确切存储的信息吗?我知道,这可能取决于JVM,但也许至少对于HotSpot?我正在寻找专门针对第一行的确切描述。
我已经阅读了一些信息,这些信息无法用我找到的信息进行正面验证。也许你有指向全部内容的OpenJDK Wiki的链接?
回答:
对象头由一个标记词和一个klass指针组成。
所述标记字具有(字大小4 byte
在32位体系结构中,8 byte
在64位体系结构)和
在克拉斯指针对字大小32 bit
的架构。在64 bit
体系结构上,klass指针要么具有字长,但是4 byte
如果可以在这些堆中编码堆地址,也可以具有字长4 bytes
。
此优化称为“压缩的oops”,你也可以使用option进行控制UseCompressedOops。
你还可以找到关于此的Wiki条目1。
该标志词实际上是使用了很多东西。
- 一是
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)
以上是 什么是Java对象标头 的全部内容, 来源链接: utcz.com/qa/404734.html