Java对象与JVM(二) Java对象在Java虚拟机中的内存布局
一、对象头(Header)
对象头(Header)包括两个部分。
第一部分存储自身运行时数据,如:哈希码(Hash Code)、GC分代年龄、锁状态标志、线程持有锁、偏向线程id、偏向时间戳等。这部分官方称为“Mark Word”。
另一部分是类型指针,即对象指向它的类元数据的指针。虚拟机通过这个来确定这个对象是哪个类的实例。
二、实例数据(Instance Data)
实例数据(Instance Data),是存储对象真正的有效信息,也就是程序代码中所定义的各种类型字段内容。
三、对其填充(Padding)
对齐填充(Padding)并不是必须的,也没有特殊的含义,可以把这部分理解为占位符。
四、实例数据
对象真正存储的有效信息; 程序代码所定义的各种类型字段内容,以及包括父类继承或子类定义的; 存储顺序: 受到JVM分配策略参数(FiedAllocationStyle)和字段在Java源码中定义顺序影响; JVM默认分配策略为:longs/double、ints、short/char、boolean、oops(Ordiary Object Pointers); VM默认分配策略使得,相同宽度的字段总被分配到一起; 这个前提下,父类定义的变量出现在子类之前; 如果虚拟机的"CompactFields"参数为true,子类中较窄的变量可能插入到父类变量空隙中,以压缩节省空间;
五、对齐填充
不是必然存在的; 只起占位符作用,没有其他含义; HotSpot虚拟机要求对象大小必须是8字节的整数倍; 对象头是8字节整数倍,所以填充是对实例数据没有对齐的情况来说的;
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/291866.html