Java对象头的HotSpot实现分析

发表于:2017-2-22 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:占小狼    来源:51Testing软件测试网采编

#
java
分享:
  HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。
  对象头
  对象头包括两部分:Mark Word 和 类型指针。
  Mark Word
  Mark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致。
  类型指针
  类型指针指向对象的类元数据,虚拟机通过这个指针确定该对象是哪个类的实例。
  markOop实现
  HotSpot通过markOop类型实现Mark Word,具体实现位于markOop.hpp文件中。
  由于对象需要存储的运行时数据很多,考虑到虚拟机的内存使用,markOop被设计成一个非固定的数据结构,以便在极小的空间存储尽量多的数据,根据对象的状态复用自己的存储空间,32位虚拟机的markOop实现如下:
  hash: 保存对象的哈希码
  age: 保存对象的分代年龄
  biased_lock: 偏向锁标识位
  lock: 锁状态标识位
  JavaThread*: 保存持有偏向锁的线程ID
  epoch: 保存偏向时间戳
  markOop中不同的锁标识位,代表着不同的锁状态:
  不同的锁状态,存储着不同的数据:
  markOop中提供了大量方法用于查看当前对象头的状态,以及更新对象头的数据,为synchronized锁的实现提供了基础。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号