对象的内存布局

在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地址

总图如下:

锁的膨胀过程如下:

最新文章

  1. CCF 201612-2 工资计算 java 解题
  2. Mysql 变量使用
  3. [Config]Zabbix的Mongodb插件安装,centos
  4. Unity3D中Console控制台的扩展
  5. windows添加虚拟网卡
  6. Emacs 列编辑
  7. Android Fragment详解
  8. ajax 返回数据 无法得到其属性的解决办法
  9. css笔记13:display用法
  10. Yii PHP 框架分析 (一)
  11. python模块—optparse
  12. Apache Hadoop 2.9.2 的快照管理
  13. 使用QPlainText代替QText
  14. C# 事务 四种事务隔离级别
  15. 深入理解JVM(一)——JVM内存模型
  16. 浅谈XSS攻击原理与解决方法
  17. 微信小程序 - cb回调(typeof cb == "function" && cb(obj);)
  18. Ubuntu下安装MySQL及简单操作
  19. Pthreads 信号量,路障,条件变量
  20. 30 个免费的 Sketch 必备插件

热门文章

  1. docker下安装nginx并实现https访问
  2. LeetCode 788. 旋转数字(Rotated Digits) 36
  3. 20190715《Python网络数据采集》第 1 章
  4. OpenJDK自动安装脚本 InstallOpenJDK.vbs
  5. Jmeter参数化(_csvread函数、CSV Data Set Config)
  6. iframe 边框(界面技术)
  7. 报告题目:HAO智能:HI + AI + OI
  8. Install Gnome desktop
  9. 并发编程之Disruptor并发框架
  10. 并发编程之Java锁