Loading

对象的内存布局

img

不同状态下锁对象Mark Word的存储分布 对象头Mark Word不同状态时的存储

HotSpot虚拟机中对象的构成

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

对象头(Header)的信息:

  1. 对象自身的运行时数据(Mark Word)。哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。
  2. 类型指针(Klass Point)。即对象指向它的类型元数据的指针。Java虚拟机通过这个指针来确定该对象是哪个类的实例。如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据。因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是如果数组的长度是不确定的,将无法通过元数据中的信息推断出数组的大小。

实例数据(Instance Data):

  • 程序代码里面所定义的各种类型的字段内容。
  • 存储顺序会受到虚拟机分配策略参数(-XX:FieldsAllocationStyle参数)和字段在Java源码中定义顺序的影响。
  • 默认的分配顺序为longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers,OOPs)

对齐填充(Padding):

  • 这并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。任何对象的大小都必须是8字节的整数倍,对象头部分已经被精心设计成正好是8字节的倍数(1倍或者2倍),因此,如果对象实例数据部分没有对齐的话,就需要通过对齐填充来补全。

参考:

https://www.cnblogs.com/zhanjindong/p/3757767.html

https://mp.weixin.qq.com/s/2yxexZUr5MWdMZ02GCSwdA

https://www.debugger.wiki/article/html/1617412680638259

posted @ 2021-06-27 21:19  FynnWang  阅读(32)  评论(0编辑  收藏  举报