美文网首页JavaSEjava进阶干货Android知识
JVM源码分析之java对象头实现

JVM源码分析之java对象头实现

作者: 美团Java | 来源:发表于2016-11-25 13:14 被阅读4408次

转载请注明原创出处,谢谢!
简书占小狼
http://www.jianshu.com/users/90ab66c248e6/latest_articles

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


我是占小狼
坐标魔都,白天是上班族,晚上是知识的分享者
如果读完觉得有收获的话,欢迎点赞加关注


我的微信公众号

相关文章

网友评论

  • 依叹:你好,请问刚刚 new 的对象的mark word 到底是偏向锁状态还是无锁状态呢?
  • 择夕_:抄的吧,为啥没写来源
    美团Java:你咋知道?
  • abc_wangyu:32位虚拟机的markOop的图中,最后两列中的名词能帮忙解释下吗?:grin:
  • 0a88c5a81294:请教下,不是无锁状态的时候,对象的hashCode在什么地方?
    爱吃小馒头:@占小狼 你好,这里的数据保存在哪里去了哇
    hongrm:java并发编程的艺术有详细的解释,在第二章吧
    美团Java:@wangwill 在变成有所状态,原来的数据会被保存起来的
  • 白马王朗:mark 我是head

本文标题:JVM源码分析之java对象头实现

本文链接:https://www.haomeiwen.com/subject/bfabpttx.html