Java对象头组成
- 64位JVM的普通对象头(Object Header)
一个对象头由mark word(64位)和klass word组成,数组长度是可选项
- 64位mark word结构
如果该对象加锁,markword就会由原来的01(无锁)标志位变成10(重量级锁),前面的hashcode,age,biased_lock由pty_to_heavyweight_monitor替代(也就是monitor地址)
实例代码
- 相关测试依赖
<!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.9</version>
</dependency>
public class Test01 {
public static void main(String[] args) {
Object object = new Object();
// 当前没有线程竞争,也就是无锁态,后三位标志位为001
System.out.println(ClassLayout.parseInstance(object).toPrintable());
}
}
- 对象头(object header)一共有12个字节,其中前8个字节是Mark Word,也就是64位组成
0 4 (object header) 01 00 00 00 (00000001 00000000 00000000 00000000) (1)
4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)
Mark Word最后3位是001(由于是小端存储,也就是低位字节放高位存储)
- 还有4个字节是Klass Word,也就是4个字节,32位
8 4 (object header) e5 01 00 20 (11100101 00000001 00000000 00100000) (536871397)