对象的内存布局
不同状态下锁对象Mark Word的存储分布
HotSpot虚拟机中对象的构成
- 对象头(Header)
- 实例数据(Instance Data)
- 对齐填充(Padding)
对象头(Header)的信息:
- 对象自身的运行时数据(Mark Word)。哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。
- 类型指针(Klass Point)。即对象指向它的类型元数据的指针。Java虚拟机通过这个指针来确定该对象是哪个类的实例。如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据。因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是如果数组的长度是不确定的,将无法通过元数据中的信息推断出数组的大小。
实例数据(Instance Data):
- 程序代码里面所定义的各种类型的字段内容。
- 存储顺序会受到虚拟机分配策略参数(-XX:FieldsAllocationStyle参数)和字段在Java源码中定义顺序的影响。
- 默认的分配顺序为longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers,OOPs)
对齐填充(Padding):
- 这并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。任何对象的大小都必须是8字节的整数倍,对象头部分已经被精心设计成正好是8字节的倍数(1倍或者2倍),因此,如果对象实例数据部分没有对齐的话,就需要通过对齐填充来补全。
参考:
https://www.cnblogs.com/zhanjindong/p/3757767.html