用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,这部分数据的长度在32位和64位的虚拟机(暂 不考虑开启压缩指针的场景)中分别为32个和64个Bits。
-
new一个空对象在32为系统中占用内存大小是8byte(对象头,在堆中)+4byte(对象的引用地址,在栈中)=12byte;
-
new一个空对象在64为系统中占用内存大小是16byte(对象头,在堆中)+8byte(对象的引用地址,在栈中)=24byte;如果开启了压缩指针机制 那么就是 8byte(对象头)+4byte的链接指针+4byte(栈中的引用地址)。
Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。
无锁状
加锁状态
其中轻量级锁和偏向锁是Java 6 对 synchronized 锁进行优化后新增加的,稍后我们会简要分析。
这里我们主要分析一下重量级锁也就是通常说synchronized的对象锁,锁标识位为10,其中指针指向的是monitor对象(也称为管程或监视器锁)的起始地址。
每个对象都存在着一个 monitor 与之关联,对象与其 monitor 之间的关系有存在多种实现方式,如monitor可以与对象一起创建销毁或当线程试图获取对象锁时自动生成,但当一个 monitor 被某个线程持有后,它便处于锁定状态。
在Java虚拟机(HotSpot)中,monitor是由ObjectMonitor实现的,其主要数据结构如下(位于HotSpot虚拟机源码ObjectMonitor.hpp文件,C++实现的)
ObjectMonitor() {
_header = NULL;
_count = 0; //记录个数
_waiters = 0,
_recursions = 0;
_object = NULL;
_owner = NULL;
\_WaitSet = NULL; //处于wait状态的线程,会被加入到\_WaitSet
_WaitSetLock = 0 ;
_Responsible = NULL ;
_succ = NULL ;
_cxq = NULL ;
FreeNext = NULL ;
_EntryList = NULL ; //处于等待锁block状态的线程,会被加入到该列表
_SpinFreq = 0 ;
# **Java高频面试专题合集解析:**
![阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等](https://www.icode9.com/i/ll/?i=img_convert/622f5c57cda58627218db5aab7059d42.png)
当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,在这也是免费分享给那些有需要的朋友,其中囊括了**Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构资料和完整的Java架构学习进阶导图!**
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**![阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等](https://www.icode9.com/i/ll/?i=img_convert/00b17269e8c4a31507b4ef7b54e2f2f7.png)
**更多Java架构进阶资料展示**
![阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等](https://www.icode9.com/i/ll/?i=img_convert/17e3b6d9ebdf53818f7a22417ea27391.png)
![阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等](https://www.icode9.com/i/ll/?i=img_convert/b475b62fd215abeb349563996312e253.png)
**
[外链图片转存中...(img-iME4nHZg-1630824859829)]
[外链图片转存中...(img-SX3wyivG-1630824859830)]
![阿里Java岗面试百题:Spring 缓存 JVM 微服务 数据库 RabbitMQ等](https://www.icode9.com/i/ll/?i=img_convert/19acd31c6a08f52c746af8e16641d2de.png)