JVM 之对象的内存布局(2.3.2)

JVM 之对象的内存布局(2.3.2),第1张

JVM 之对象的内存布局(2.3.2) 《深入理解 Java 虚拟机》笔记 2.3.2 对象的内存布局

在 HotSpot 虚拟机中,对象在堆内存中的存储布局可以划分为三个区域:

  • 对象头(Header)
  • 实例数据(Instance Data)
  • 对齐填充(Padding)
(1)对象头

其中,对象头部分包括两类信息:

  1. 存储了对象自身运行时数据的信息:如哈希码、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等。
  2. 类型指针,即对象指向它的类型元数据的指针,Java 虚拟机通过这个指针来确定该对象是哪个类的实例。
  3. (长度确定的数组:数组的长度)
(2)实例数据

指所定义各种类型的字段内容(一个对象的各属性值)。
分配策略:

  1. 相同宽度的字段一起,宽度大的优先:longs/doubles、ints、shorts/chars、bytes/booleans、oops。
  2. 满足条件(1)的前提下,父类中定义的变量在子类前面。(HotSpot 虚拟机的 +XX: CompactFields 参数值为 true(默认值),则子类中较窄的变量也允许插入父类变量的空隙中,以节省空间。)
(3)对齐填充

HotSpot 虚拟机的自动内存管理系统要求 对象的起始地址必须是 8 字节的整数倍,即 任何对象的大小都必须是 8 字节的整数倍。
对象头部分已经被精心设计成正好是 8 字节的倍数大小了,因此,如果对象实例数据部分没有对齐的话,就需要通过对齐填充来补全。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5351210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-09
下一篇 2022-12-09

发表评论

登录后才能评论

评论列表(0条)

保存