为了账号安全,请及时绑定邮箱和手机立即绑定

什么是Java对象标头

/ 猿问

什么是Java对象标头

JVM
catspeake 2019-10-29 14:10:30

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

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


查看完整描述

3 回答

?
不负相思意

对于热点:


对象头由一个标记词和一个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)

您还可以在此处找到oop头文件。


1 https://wiki.openjdk.java.net/display/HotSpot/CompressedOops

2 https://wiki.openjdk.java.net/display/HotSpot/Synchronization


查看完整回答
反对 回复 2019-10-29
?
动漫人物

以下演示为您提供了对象内容和对象标题的一般概念:http : //www.slideshare.net/cnbailey/memory-ficient-java


任何对象的实际标头都是特定于JVM供应商,版本和对象类型的。


查看完整回答
反对 回复 2019-10-29
?
慕村225694

您可以从HotSpot源中找到对象布局。


标头由markOop组成,后跟指向instanceKlass的指针(或压缩指针)。


查看完整回答
反对 回复 2019-10-29
  • 3 回答
  • 0 关注
  • 377 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信