对象的内存布局

HotSpot虚拟机里,对象在内存里的布局可以分成3块区域,分别是对象头,实例数据,对齐填充。

  1. 对象头

    对象头又分成两部分。
    第一部分为Mark Word,用于存储对象自身的运行时数据,比如 哈希码,GC分代年龄,锁状态标志,线程持有的锁等。
    第二部分则是类型指针,指向类元数据,即确定这个是哪个类的实例。
    如果对象是数组,对象头中还要有一块记录数组长度的数据。普通的java对象可以通过元数据信息确定java对象的大小,
    但是数组的元数据却无法确定数组的大小。
    
  2. 实例数据

    实例数据是对象真正存储的有效信息,也是在程序代码中定义的各种类型的字段内容。
    
  3. 对齐填充

    没有特别的含义,起着占位符的作用。HotSpot VM的自动内存管理系统要求对象的大小必须是8字节的整数倍,
    对象头部分是8字节,对象实例部分是没有对齐的,所以需要这部分来填充补全。
    

对象的访问方式
分为句柄访问和直接指针访问
句柄访问,reference中存储的就是对象句柄的地址, java堆中会有一块句柄池的内存,句柄中存放指向位于方法区的类型数据的地址 和 指向堆中的实例对象的地址
直接指针访问,reference中存储的就是堆中的对象实例地址,java堆的对象布局中包括了位于方法区的对象类型数据的地址。
Sun HotSpot采用的是直接指针的方式

使用句柄访问,reference中存储的就是稳定的句柄地址,对象移动时只会改变句柄中的实例数据的指针。reference本身不需改变。
使用直接指针访问,速度更快,节省了一次指针定位的时间开销
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值