目 录CONTENT

文章目录

Java内存布局与对象头

Administrator
2022-10-30 / 0 评论 / 1 点赞 / 1682 阅读 / 2933 字

前言

  1. new一个对象(如new Object()),占多少空间?
  2. 一个对象由哪些部分构成?

对象在堆内存中的存储布局

在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
微信截图_20220924195409.png

对象头

  1. 对象头分为对象标记(markOop)和类元信息(klassOop),类元信息存储的是指向该对象类元数据(klass)的首地址。
    提问:一个对象的hashcode、gc标记、gc次数、锁标记等存放于何处?
    上诉皆存放于对象头的对象标记中
    微信截图_20220924195749.png
    微信截图_20220924200022.png
    该图回答上诉new一个空对象占用多少内存,即16个字节
    下图展示一个对象的内存布局:
    微信截图_20220924200408.png

实例数据

存放类的属性(Field)数据信息,包括父类的属性信息

对齐填充

虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐这部分内存按8字节补充对齐。

Mark Word中记录的信息

微信截图_20220924201237.png
微信截图_20220924201302.png

拓展:为什么gc的最大分代年龄是15?因为对象头中仅有4bit用来记录分代年龄,则代表最大二进制为1111,转为十进制则为15

1

评论区