Jvm 深入理解(四)—— 探究对象的结构(Hotspot虚拟机)

对象结构

在HotSpot虚拟机中,对象在内存中的存储分为三块区域:对象头(header)、实例数据(instance data)、对齐填充(padding)

  • 普通对象的结构
    在这里插入图片描述
  • 数组对象的结构
    在这里插入图片描述

上面两个图中可以看出,以下信息
- markWord(标记字段):大小是4个字节,主要存储一系列的标志位信息,不如轻量级锁的标志位、偏向锁的标志位等
- Class pointer(类型指针):大小是4个字节,其指向的地址是Class对象(其对应的元数据对象)的内存地址
- 数组长度(只有数组对象才有):大小是4个字节,普通对象在分配内存前Jvm已经确定其大小,数组对象大小无法确定,所以需要单独存储以下数组的长度。

对象头
  • markword(标记字段)
    • 主要存储一系列的标志位信息,包括对象自身的哈希码、GC分代年龄、锁状态、持有锁的线程、偏向锁id、偏向时间戳等
    • markword在32位和64位操作系统中,分别占32bit和64bit。对象实际运行数据要大于这个值,对象头是与对象自身定义数据无关的独立存储空间,为了尽量多的存储数据,一般为非固定的数据结构。
    • 无锁状态下,在32位操作系统中,markword 的32bit中使用25bit来存储对象的哈希码(hashCode),4bit存储GC分代年龄,2bit存储锁状态标志位,1bit 固定位 0
      在这里插入图片描述
    • 在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容如下表所示。
      在这里插入图片描述
    • hotspot中关于markword 和 锁的相关信息如下
存储内容标志位状态
对象哈希码、GC分代年龄01未锁定
指向锁记录指针00轻量级锁
指向重量级锁指针10膨胀(重量级锁)
空,不需要记录信息11GC标记
便向线程ID、偏向时间戳、GC分代年龄01可偏向
  • 锁的状态变化
    在这里插入图片描述
  • class pointer(类型指针)
    • 指向对象对应的元数据信息的指针,虚拟机通过这个指针用来确定当前对象是哪个对象的实例。
实例数据(instance data)
  • 是对象真正存储的有效信息,也是我们程序代码里面定义的各种类型的字段内容,无论是在父类中继承下来的还是在子类中定义的都要记录下来。
对其填充
  • 这部分不是必须的,hotspot 虚拟机中要求对象的存储空键必须是8个字节的整数倍,如果一个对象大小不足8个字节的整数倍,就需要用对齐填充进行补充
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值