java对象结构对象头Markword-创新互联

java对象结构 对象头 Markword?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

成都创新互联公司2013年成立,先为东丽等服务建站,东丽等地企业,进行企业商务咨询服务。为东丽企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

概述

对象实例由对象头、实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度;

| 类型 | 32位JVM | 64位JVM|
| ------ ---- | ------------| --------- |
| markword | 32bit | 64bit |
| 类型指针 | 32bit |64bit ,开启指针压缩时为32bit |
| 数组长度 | 32bit |32bit |

java对象结构 对象头 Markword

header.png

java对象结构 对象头 Markword

compressed_header.png

可以看到

开启指针压缩时,markword占用8bytes,类型指针占用8bytes,共占用16bytes;

未开启指针压缩时,markword占用8bytes,类型指针占用4bytes,但由于java内存地址按照8bytes对齐,长度必须是8的倍数,因此会从12bytes补全到16bytes;

数组长度为4bytes,同样会进行对齐,补足到8bytes;

另外从上面的截图可以看到,开启指针压缩之后,对象类型指针为0xf800c005,但实际的类型指针为0x7c0060028;那么指针是如何压缩的呢?

实际上由于java地址一定是8的倍数,因此将0xf800c005*8即可得到实际的指针0x7c0060028,关于指针压缩的更多知识可参考官方文档。

markword结构

markword的结构,定义在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)
 [ptr    | 00] locked    ptr points to real header on stack
 [header  | 0 | 01] unlocked   regular object header
 [ptr    | 10] monitor   inflated lock (header is wapped out)
 [ptr    | 11] marked    used by markSweep to mark an object

名称栏目:java对象结构对象头Markword-创新互联
本文路径:http://scyanting.com/article/hjhdh.html