作者:贝贝2602932923 | 来源:互联网 | 2023-01-22 17:50
在HotSpot虚拟机中,对象在内存中的布局可以分为3块区域:对象头(Header),实例数据(InstanceData)和对齐填充(Padding)。——《深入理解java虚拟机
在HotSpot虚拟机中,对象在内存中的布局可以分为3块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding)。——《深入理解java虚拟机》
布局:
对象头:
共包括两个部分:
Tips:如果对象是一个Java数组,那么在对象头中还必须有一块用于记录数组长度的数据。(JVM可以通过普通java对象的元数据信息确定java对象的大小,但是从数组的元数据中无法得知数组的大小)。
运行时数据(Mark Word)
这个部分主要包括:哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳。
在32位和64位的虚拟机中长度分别为32bit和64bit
在32位的HotSpot虚拟机中,如果对像除以未被锁定的状态下:
类型指针
AKA:对象指向它的类元数据的指针,虚拟机通过这个指针来判断这个对象是哪个类的实例。(并不是所有虚拟机都需要保留)。
实例数据
记录从父类继承和自己定义的字段的内容。
在Hotspot中的分配策略:
longs/doubles
ints
shorts/chars
bytes/booleans
oops(Ordinary Object Pointers)
相同字宽的会被分配到一起。在父类中定义的变量出现在子类之前。
对齐填充
存在的意义:占位符
HotSpot VM的自动内存管理系统要求对象的起始地址必须为8字节的整数倍。(对象的大小必须为8字节的整数倍,对象头部分正好是8字节的倍数)。当实例数据没有对齐时需要通过对齐填充来补全。