Java对象与JVM(二) Java对象在Java虚拟机中的内存布局


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

(0)
上一篇 2022年10月26日
下一篇 2022年10月26日

相关推荐

发表回复

登录后才能评论