Synchronized实现原理
一、Java对象结构(以HotSpot为例)
OOP-Klass模型
何为OOP
HotSpot JVM并没有将Java实例对象直接一对一映射到native的C++对象,而是设计了一个oop-klass模型。
何为oop呢?实际上指 ”对象-类“二者中的对象,oop全称 Ordinary Object Pointer(普通对象指针),看起来仅仅为一个指针、一个内存地址罢了,实则还是对内存地址的描述,即对内存中数据结构的描述
所以,JVM对象的类被定义为 oopDesc
class oopDesc { friend class VMStructs; private: volatile markOop _mark; // 对象头 union _metadata { wideKlassOop _klass;//普通指针 narrowOop _compressed_klass;//压缩类指针 } _metadata; private: ….省略不相干的代码 }
class instanceOopDesc : public oopDesc { //普通对象类型 ….省略不相干的代码 } class arrayOopDesc : public oopDesc { //数组对象类型 ….省略不相干的代码 }
每当在Java代码中new一个对象时,JVM会创建一个instanceOopDesc实例表示这个对象,该对象实例存放在堆区。类似的Java代码中new一个数组时,JVM会创建一个arrayOopDesc实例来表示。
何为Klass
何为kclass?实际指”对象-类“中的类
为了区别于Java的Class类型,Jvm中用klass来描述类型,Klass包含元数据和方法信息,用以描述语言层的类型
HotSpot为每一个已加载的Java类创建一个instanceKlass 对象,用来在JVM层表示Java元数据对象(即给VM内部使用),对JAVA层面的类元数据对象为java.lang.Class类型的对象(实例)。
也就是说,一份类的元数据,出现了为两个层面提供两个对象Class对象 和 InstanceKlass。
因为一个普通Java对象的底层为一个instanceOopDesc实例,同时Java的Class实例也是一个普通Java对象,也是一个instanceOopDesc实例,这个实例,被成为JVM层 InstanceKlass实例的”Java镜像“
Java对象结构
关于oop-klass模型的了解后,就比较好的了解Java对象,本质上是C++ InstanceOopDesc的结构
Java对象(Object实例)结构包括三部分:对象头、对象体、对齐字体
1.2 Java对象(Object实例)的三个部分
(1)对象头(Header)
对象头包括三个字段,第一个字段为_mark Word&