对象在堆内存中布局
对象在堆内存中布局
对象在堆内存中布局:
在HotSpot虚拟机里,对象在堆内存的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)
和对齐填充(Padding)。
存储布局:
- 对象头(在64位系统中,Mark Word占了8个字节,类型指针占了8个字节,一共是16个字节)
-
- 对象标记(Mark Word)
-
-
- 默认存储对象的HashCode、分代年龄和锁标志等信息。
- 这些信息都是与对象自身定义无关的数据,所以Mark Word被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。
- 它会根据对象的状态复用自己的存储空间,也就是说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化。
-
-
- 类元信息(类型指针)
-
-
- 对象指向它的类元数据的指针,指针指向方法区中该对象对应的 Class 对象(类的元数据)。通过它,JVM
可以确定对象的类型,从而支持多态、反射等特性(例如通过obj.getClass()获取类信息)
- 对象指向它的类元数据的指针,指针指向方法区中该对象对应的 Class 对象(类的元数据)。通过它,JVM
-
- 实例数据
-
- 存放类的属性(Field)数据信息,包括父类的属性信息
- 对齐填充(保证8个字节的倍数)
-
- 虚拟机要求对象起始地址必须是8字节的整数倍,填充数据不是必须存在的,仅仅是为了字节对齐,这部分内存按8字节补充对齐。
聊聊Object obj = new Object()
通过JOL(Java Object Layout)工具分析 Object obj = new
Object() 时对象在内存中的布局:
(注意:读二进制时,每一行从右往左读,每一组二进制从左往右读)
最后对齐填充了四字节凑够了8的倍数

浙公网安备 33010602011771号