1 【理解HotSpot虚拟机】对象在jvm中的表示:OOP-Klass模型
个人理解:jvm会创建一个 c++语言里的对象,然后引用
一个OOP对象包含以下几个部分:
- instanceOopDesc,也叫对象头
- Mark Word,主要存储对象运行时记录信息,如hashcode, GC分代年龄,锁状态标志,线程ID,时间戳等
- 元数据指针,即指向方法区的instanceKlass实例
- 实例数据
http://blog.youkuaiyun.com/linxdcn/article/details/72896616
4 Mark Word 表头的数据
考虑到虚拟机的空间效率,Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。
下图描述了在32位虚拟机上,在对象不同状态时 mark word各个比特位区间的含义:
对象头中主要包含了GC分代年龄、锁状态标记、哈希码、epoch等信息。从上图中可以看出,对象的状态一共有五种,分别是无锁态、轻量级锁、重量级锁、GC标记和偏向锁。在32位的虚拟机中有两个Bits是用来存储锁的标记为的,但是我们都知道,两个bits最多只能表示四种状态:00、01、10、11,那么第五种状态如何表示呢 ,就要额外依赖1Bit的空间,使用0和1来区分。
1 无锁---》偏向锁(竞争时暂停使用【酒店房间】)--》轻量级锁(自旋)【公共厕所】--》重量级锁【医院手术台】(阻塞队列)
1 【偏向锁】老大jvm随手使用CAS操作把我的线程ID记录到了这个Mark Word当中,修改了标识位,然后告诉我说: 可以了,你现在拥有这把锁了,进去执行代码吧。
问题 :偏向锁对象头里存的不是线程id ,其实存的是 JavaThread对象的指针地址。图片没法修改了,在此更正
偏向锁
轻量级锁
重量级锁
访问条件越来越严苛
绝对金典
https://blog.youkuaiyun.com/noble510520/article/details/78834224