java对象在内存中的结构以及对象访问定位形式

对象在内存中的结构

  • 对象头
    • markword(存储对象自身的运行时数据,如哈 希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等)
    • 指向类型元数据的指针,如果是数组,还需要有长度信息(普通对象的大小编译时已经确定,数组类型必须记录长度)
  • 实例数据
  • 对齐填充(java虚拟机要求对象起始地址为8字节的整数倍,弥补实例数据部分的不足)

对象访问定位形式

  • 句柄

    在java堆中划分出一块内存来作为句柄池,reference中存储着对象的句柄地址,句柄中又分别记录着对象的实例和对象元数据的的地址信息

    在这里插入图片描述

  • 直接指针

    reference中存储的直接就是对象地址,对象元数据信息由对象头记录指针,hotspot就使用这种方法访问对象

    在这里插入图片描述
    图片来源于深入理解java虚拟机

直接指针的访问速度快,句柄访问在对象移动的时候(标记复制/整理都会涉及到)无需改变reference,只需修改句柄引用即可,因此两者各有优势。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值