JAVA对象结构
2024-10-21 13:05:10
对象的内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header),实例数据(Instance Data)和对象填充(Padding)。
- 实例数据:对象真正存储的有效信息,存放类的属性数据信息,包括父类的属性信息;
- 对齐填充:由于虚拟机要求 对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。
- 对象头:Hotspot虚拟机的对象头主要包括两部分数据:Mark Word(标记字段)、Class Pointer(类型指针)。
对象头
对象头主要包括两部分数据:Mark Word(标记字段)、Class Pointer(类型指针)。
- Class Pointer:是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例
- Mark Word : 用于存储对象自身的运行时数据,它是实现轻量级锁和偏向锁的关键。
Mark word
Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等。
在32位的HotSpot虚拟机中,如果对象处于未被锁定的状态下,那么Mark Word的32bit空间里的25位用于存储对象哈希码,4bit用于存储对象分代年龄,2bit用于存储锁标志位,1bit固定为0,表示非偏向锁。其他状态如下图所示:
- 前面分析可知,monitor特点是互斥进行,你再喵一下上图,重量级锁,指向互斥量的指针。
- 其实synchronized是重量级锁,也就是说Synchronized的对象锁,Mark Word锁标识位为10,其中指针指向的是Monitor对象的起始地址。
- 顿时,是不是感觉柳暗花明又一村啦!对象与monitor怎么关联的?答案:Mark Word重量级锁,指针指向monitor地址。
总图如下:
锁的膨胀过程如下:
最新文章
- CCF 201612-2 工资计算 java 解题
- Mysql 变量使用
- [Config]Zabbix的Mongodb插件安装,centos
- Unity3D中Console控制台的扩展
- windows添加虚拟网卡
- Emacs 列编辑
- Android Fragment详解
- ajax 返回数据 无法得到其属性的解决办法
- css笔记13:display用法
- Yii PHP 框架分析 (一)
- python模块—optparse
- Apache Hadoop 2.9.2 的快照管理
- 使用QPlainText代替QText
- C# 事务 四种事务隔离级别
- 深入理解JVM(一)——JVM内存模型
- 浅谈XSS攻击原理与解决方法
- 微信小程序 - cb回调(typeof cb == ";function"; &;&; cb(obj);)
- Ubuntu下安装MySQL及简单操作
- Pthreads 信号量,路障,条件变量
- 30 个免费的 Sketch 必备插件
热门文章
- docker下安装nginx并实现https访问
- LeetCode 788. 旋转数字(Rotated Digits) 36
- 20190715《Python网络数据采集》第 1 章
- OpenJDK自动安装脚本 InstallOpenJDK.vbs
- Jmeter参数化(_csvread函数、CSV Data Set Config)
- iframe 边框(界面技术)
- 报告题目:HAO智能:HI + AI + OI
- Install Gnome desktop
- 并发编程之Disruptor并发框架
- 并发编程之Java锁