并发编程(十二)java Mark Word讲解

141 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

1.java对象内存布局

对象在内存中存储的布局可以分为三块区域:对象头(Header)实例数据(Instance Data)对齐填充

1.对象头中的又分为三部分:Mark Word、指向类的指针、数组长度

2.实例数据:对象真正存储的有效信息,即我们在代码里面所定义的各种类型的字段内容,无论是从父类继承下来的,还是子类中定义的字段都必须记录起来。

3.对齐填充:在虚拟机中对象起始地址必须是8字节的整数倍。对齐填充这部分不是必须存在的,仅仅是为了字节对齐。原因是为了寻址最优,64位机器正好8个字节。

2.Mark Word

Mark Word在64位jvm中:

image.png

Mark Word在32位JVM中:

image.png

其实这两个Mark Word含义是相同的,64位中unused代表未使用的填充数据。

我们这里拿32位的举例说明:

无锁状态:前25位是对象的hashCode;4位分代年龄;1位是否偏向锁为0;2位锁标志位是01.

偏向锁状态:前23为是线程id,记录持有当前对象的线程;2位epoch代表的含义是在这个对象的类信息里面也有一个epoch,每次系统到达安全点会对类的 epoch 加 1,变成 epoch_new,然后扫描所有的这个类的实例,判断该偏向锁是否还被持有,如果被持有则将 epoch_new 复制给对象头的 epoch 字;4位分代年龄,1位是否偏向锁为1,2位锁标志位是01.

轻量级锁状态:前30位是指向栈中锁记录的指针;2位锁标志位是00.

重量级锁状态:前30位是指向互斥锁 (重量级锁) 的指针;2位锁标志位是10.

GC标记状态:前30位是空;2位锁标志位是11.

这一章节就先大概了解一下Mark Word里的具体信息,后续我们会根据字节码进行讲解!