一尘不染

什么是Java对象标头

java

你能给我一些有关对象头中确切存储的信息吗?我知道,这可能取决于JVM,但也许至少对于HotSpot?我正在寻找专门针对第一行的确切描述。

我已经阅读了一些信息,这些信息无法用我找到的信息进行正面验证。也许你有指向全部内容的OpenJDK Wiki的链接?


阅读 366

收藏
2020-03-19

共1个答案

一尘不染

对象头由一个标记词和一个klass指针组成。

所述标记字具有(字大小4 byte在32位体系结构中,8 byte在64位体系结构)和

在克拉斯指针对字大小32 bit的架构。在64 bit体系结构上,klass指针要么具有字长,但是4 byte如果可以在这些堆中编码堆地址,也可以具有字长4 bytes

此优化称为“压缩的oops”,你也可以使用option进行控制UseCompressedOops。

你还可以找到关于此的Wiki条目1。

该标志词实际上是使用了很多东西。

  1. 一是Biased Locking 2,HotSpot可以通过它实现有效的锁定。
  2. 它还在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)
2020-03-19