NOTE

7.16 对象在内存中的布局

1. 对象的组成 对象有两种,一个普通对象,另一种数组对象 1.1. 对象头(Object Header) 1. mark word 存储了对象的hashCode、GC信息、锁信息三部分 - 锁信息:不同的状态存储的位的意义不同。跟锁有关的是最后三个bit位,001表示无锁态,00表示轻量级锁,10

Java创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 对象的组成

对象有两种,一个普通对象,另一种数组对象

1.1. 对象头(Object Header)

  1. mark word 存储了对象的hashCode、GC信息、锁信息三部分
  • 锁信息:不同的状态存储的位的意义不同。跟锁有关的是最后三个bit位,001表示无锁态,00表示轻量级锁,10表示重量级锁,101表示偏向锁。
  1. class pointer:指向类的指针,比如我new Test(),那么这个就是指向方法区Class<Test>的地址
  2. 数组长度:如果是数组的话那么这个长度就表示数组的长度

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

3. 参考