前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jvm对象的访问

jvm对象的访问

作者头像
海向
发布2020-07-03 10:23:21
8050
发布2020-07-03 10:23:21
举报
文章被收录于专栏:海向

对象的内存布局

在 HotSpot虚拟机中,对象在内存中存储的布局分为三块区域:对象头,实例数据,和对齐填充。

对象头

对象头包括如下两部分信息:

  • MarkWord:用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。为了在极小空间内存储更多的信息,它被设计成了一个非固定的数据结构,根据对象的状态来复用自己的存储空间,如下: 存储内容 标志位 状态 对象哈希码、分代年龄 01 未锁定 指向锁记录的指针 00 轻量级锁定 指向重量级锁的指针 10 膨胀(重量级锁定) 空 11 GC标记 偏向线程ID\偏向时间戳、分代年龄 01 可偏向
  • 类型指针:到对象类型数据的指针,即虚拟机通过这个指针来确定这个对象属于哪个类。(有的虚拟机通过句柄池来实现)
  • 如果对象是一个数组:对象头还需要有一块空间来记录数组长度,因为对象可以通过类型指针判断Java对象大小,而数组不行。

实例数据

是对象真正的有效数据,也就是代码中所定义的各种类型的字段内容,无论是从父类继承还是子类记录的都必须进行存储。

对齐填充

对齐填充并不是必然存在的,也没有其它的意义,仅仅是占位符的作用,因为HotSpot虚拟机的自动内存管理系统要求对象地址必须是8的整数倍,当实例数据没有对齐时,就需要对齐填充来进行补齐。

对象的访问

当我们使用对象时,我们需要通过虚拟机栈上的reference数据(即worker)来操作堆上的具体对象。

代码语言:javascript
复制
public Worker buildWorker(){
	Worker woker = new Woker();
	worker.setAge(21);
	....
	return worker;
}

访问具体对象的方式不同虚拟机有不同的实现,主流的方式有以下两种

使用句柄池

在Java堆中专门划分处一部分内存作句柄池,reference中存储的是对应对象的句柄地址,而句柄池中包含了对象实例数据类型数据具体的地址信息,如下图:

使用直接指针访问

直接指针访问,reference中直接存储对象地址。

两种方式的比较

  • 使用句柄池来访问最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时整体空间位置)时只会改变句柄中的实例数据指针,而reference不需要任何改变。
  • 使用直接指针访问最大的好处就是快,节省了一次指针定位的时间开销,由于对象访问在java中非常频繁,积少成多,节省这样的开销效益非常可观。
  • 主要虚拟机HotSpot采用直接指针访问,但是许多其他语言和框架使用句柄这种思想也非常常见。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 对象的内存布局
    • 对象头
      • 实例数据
        • 对齐填充
        • 对象的访问
          • 使用句柄池
            • 使用直接指针访问
              • 两种方式的比较
              相关产品与服务
              对象存储
              对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档