专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
黑马程序员  ·  Java面试时,你被深挖过什么问题? ·  4 天前  
芋道源码  ·  MySQL 处理大数据表的 3 ... ·  6 天前  
Java编程精选  ·  Springboot代码混淆,别再让代码在线 ... ·  6 天前  
芋道源码  ·  阿里又开源一款数据同步工具 ... ·  1 周前  
芋道源码  ·  感受 lambda 之美! ·  1 周前  
51好读  ›  专栏  ›  ImportNew

Java 对象头的 HotSpot 实现分析

ImportNew  · 公众号  · Java  · 2017-03-03 20:48

正文

(点击上方公众号,可快速关注)


来源:占小狼,

www.jianshu.com/p/9c19eb0ea4d8

如有好文章投稿,请点击 → 这里了解详情


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锁的实现提供了基础。


看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能