网站上的图片做多大,微商城开发需要多少钱,手机app下载软件,上海浦东网站建设公司转载自 深入理解多线程#xff08;三#xff09;—— Java的对象头上一篇文章中我们从HotSpot的源码入手#xff0c;介绍了Java的对象模型。这一篇文章在上一篇文章的基础上再来介绍一下Java的对象头。主要介绍一下对象头的作用#xff0c;结构以及他和锁的关系。
Java对象…转载自 深入理解多线程三—— Java的对象头上一篇文章中我们从HotSpot的源码入手介绍了Java的对象模型。这一篇文章在上一篇文章的基础上再来介绍一下Java的对象头。主要介绍一下对象头的作用结构以及他和锁的关系。
Java对象模型回顾与勘误
在上一篇文章中关于对象头的部分描述有误我已经在我博客的文章中就行修正 。这里再重新表述一下。
每一个Java类在被JVM加载的时候JVM会给这个类创建一个instanceKlass保存在方法区用来在JVM层表示该Java类。当我们在Java代码中使用new创建一个对象的时候JVM会创建一个instanceOopDesc对象这个对象中包含了对象头以及实例数据。
这里提到的对象头到底是什么呢
class oopDesc {friend class VMStructs;private:volatile markOop _mark;union _metadata {wideKlassOop _klass;narrowOop _compressed_klass;} _metadata;
}
上面代码中的_mark和_metadata其实就是对象头的定义。关于_metadata之前就介绍过这里不再赘述。由于这个专题主要想介绍和JAVA并发相关的知识所以本文展开介绍一下_mark 即mark word。
对象头信息是与对象自身定义的数据无关的额外存储成本考虑到虚拟机的空间效率Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息它会根据对象的状态复用自己的存储空间。
对markword的设计方式上非常像网络协议报文头将mark word划分为多个比特位区间并在不同的对象状态下赋予比特位不同的含义。下图描述了在32位虚拟机上在对象不同状态时 mark word各个比特位区间的含义。同样在HotSpot的源码中我们可以找到关于对象头对象的定义会一一印证上图的描述。对应与markOop.hpp类。
enum { age_bits 4,lock_bits 2,biased_lock_bits 1,max_hash_bits BitsPerWord - age_bits - lock_bits - biased_lock_bits,hash_bits max_hash_bits 31 ? 31 : max_hash_bits,cms_bits LP64_ONLY(1) NOT_LP64(0),epoch_bits 2
};
从上面的枚举定义中可以看出对象头中主要包含了GC分代年龄、锁状态标记、哈希码、epoch等信息。
从上图中可以看出对象的状态一共有五种分别是无锁态、轻量级锁、重量级锁、GC标记和偏向锁。在32位的虚拟机中有两个Bits是用来存储锁的标记为的但是我们都知道两个bits最多只能表示四种状态00、01、10、11那么第五种状态如何表示呢 就要额外依赖1Bit的空间使用0和1来区分。
在32位的HotSpot虚拟机 中对象未被锁定的状态下Mark Word的32个Bits空间中的25Bits用于存储对象哈希码(HashCode)4Bits用于存储对象分代年龄2Bits用于存储锁标志位1Bit固定为0表示非偏向锁。markOop.hpp类中有关于对象状态的定义enum { locked_value 0,unlocked_value 1,monitor_value 2,marked_value 3,biased_lock_pattern 5};
简单翻译一下
locked_value(00) 0unlocked_value(01) 1monitor_value(10) 2marked_value(11) 3biasedlockpattern(101) 5关于为什么要定义这么多状态上面提到的轻量级锁、重量级锁、偏向锁以及他们之前的关系会在下一篇文章中重点阐述敬请期待。