我们知道计算机以二进制的方式存储数据,以 64 位虚拟机为例,Java 对象在内存中的存储形式为:
- 开头是 8 个字节的 markword,用于标记对象的状态。(也就是一个 long 型数据的大小。不妨记作对象头里有一个长长的 markword。)
- 然后是 4 个字节的 class pointer,用于找到自己的类,也就是让这个对象搞清楚“我是谁”这个深刻的哲学问题。(如果没有开启指针压缩,class pointer 占 8 个字节。)
- 然后是实际数据,也就是这个对象中定义的属性。
- 最后的字节用于对齐,保证对象大小是 8 个字节的倍数,这样方便内存管理。
markword除了记录了锁的信息,还记录了内存回收信息和 hashcode 信息。