NOTE
7.16 对象在内存中的布局
1. 对象的组成 对象有两种,一个普通对象,另一种数组对象 1.1. 对象头(Object Header) 1. mark word 存储了对象的hashCode、GC信息、锁信息三部分 - 锁信息:不同的状态存储的位的意义不同。跟锁有关的是最后三个bit位,001表示无锁态,00表示轻量级锁,10
这是历史学习笔记,可能存在过时或不完整的理解。
1. 对象的组成
对象有两种,一个普通对象,另一种数组对象

1.1. 对象头(Object Header)
- mark word 存储了对象的hashCode、GC信息、锁信息三部分
- 锁信息:不同的状态存储的位的意义不同。跟锁有关的是最后三个bit位,001表示无锁态,00表示轻量级锁,10表示重量级锁,101表示偏向锁。

- class pointer:指向类的指针,比如我
new Test(),那么这个就是指向方法区Class<Test>的地址 - 数组长度:如果是数组的话那么这个长度就表示数组的长度
1.2. 实例数据(Instance Data)
比如Test里面的有个Integer val属性,这里就是存的这玩意
1.3. 对齐填充(Padding)
保证8字节对齐,不足的要补充
2. 实验
- pom.xml
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.10</version>
</dependency>
- ObjectTest
public class ObjectTest
{
public static void main(String[] args)
{
Object object = new Object();
String s = ClassLayout.parseInstance(object).toPrintable();
System.out.println(s);
}
}
- 输出

2.1. 一个对象占用多少个字节
16个Bytes