Synchronized锁实现和锁升级

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&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值