Java对象头中有什么?
你能给我一些关于对象头中到底存储了什么的信息吗?我知道,它可能依赖于JVM,但至少对于HotSpot是这样吗?我正在寻找第一行的确切描述Java对象头中有什么?,java,jvm,java-memory-model,object-layout,jol,Java,Jvm,Java Memory Model,Object Layout,Jol,你能给我一些关于对象头中到底存储了什么的信息吗?我知道,它可能依赖于JVM,但至少对于HotSpot是这样吗?我正在寻找第一行的确切描述 我读过一些信息,但无法与我找到的信息进行正面验证。也许您有一个指向OpenJDK wiki的链接,说明了一切?您可以从中找到对象布局 标题由以下内容组成,后面是指向的指针(或压缩指针)。下面的演示让您大致了解对象内容和对象标题: 任何对象的实际标头都是特定于JVM供应商、版本和对象类型的。对于热点: 对象标题由标记词和klass指针组成。 标记字具有字大小(
我读过一些信息,但无法与我找到的信息进行正面验证。也许您有一个指向OpenJDK wiki的链接,说明了一切?您可以从中找到对象布局
标题由以下内容组成,后面是指向的指针(或压缩指针)。下面的演示让您大致了解对象内容和对象标题:
任何对象的实际标头都是特定于JVM供应商、版本和对象类型的。对于热点: 对象标题由标记词和klass指针组成。 标记字具有字大小(
4字节
在32位体系结构上,8字节
在64位体系结构上)和
klass指针在32位
体系结构上具有字大小。在64位
体系结构上,如果堆地址可以用这些4字节
编码,klass指针既可以有字大小,也可以有4字节
此优化称为“压缩的oops”,您也可以使用UseCompressedOops
选项对其进行控制
您还可以找到关于此的wiki条目
标记词实际上用于很多事情
偏置锁定
,HotSpot可以通过它实现高效锁定GC期间,它还用于设置前向指针
,并用于存储对象的年龄
。对象的标识哈希代码可以存储在标记内(System.identityHashCode/对象.hashCode
one)// 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头文件