引言

这里只介绍64位虚拟机的对象头的结构和内容,主要是分为以下四种状态介绍,无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。

对象头的基本结构

如下图所示

对象的结构和内容我这里就暂且不提了,本章主要讲述的对象头的内容。
对象头分为三个部分:
一、Mark Word部分,从名字就能知道它是一个记录和描述对象的部分。这也是我接下来主要讲解的部分,因为其他的内容,基本没有多大的变化情况。占八字节内存。
二、类型指针部分,也叫元数据指针什么的,主要是存储元数据的地址,对于对象的类型信息,指向方法区的类信息部分,对于对象的成员变量部分,基本类型就指向方法区的运行时常量池,String类型指向在jdk1.7之后从方法区移到堆区的字符串常量池,其他的对象类型,则指向堆区的对象存储地址。占八字节内存,jvm有默认开启指针压缩,因为发现类型指针部分用不了64位那么多,所以被指针压缩后,成为了四字节,指针压缩的原理,这里我就不说了,非本文重点。
三、数组数据部分,专门用来存储数组数据。

Mark Word的数据结构:

Mark Word的数据结构在64位jvm中如图所示:

identity_hashcode: 对象的标识码,也就是对象标识的哈希码。哈希值不是地址值,两者间的区别和联系,我现在也还不是很清晰。
age: 4bit的Java对象年龄,我们知道当对象在survivor区随着GC0反复横跳的时候,没跳一次,年龄加1,到了十五的时候,就会晋升老年代,所以其最大值就是15,那么4bit刚好能表达完。
lock: 2bit的锁状态位。
biased_lock: 1位的偏向锁标识位,0标识否,1表示是偏向锁。
如下图所示:

thread: 持有偏向锁的线程ID。
epoch: 偏向时间戳,可以理解为锁的版本号,和ABA问题中版本是一个意思。
prt_to_lock_record: 指向栈中锁记录的指针。
prt_to_heavyweight_monitor: 指向monitor(管程)的指针。
那什么是monitor?这里给出一个作者的链接地址:monitor的解释说明

谈谈Mark Word的图解

如图所示,加上上述的一些描述,我想大家应该能理解,Java,锁的是对象。
一、无锁状态:
可以看到正常的无锁状态,就包含了对象的哈希值,对象的年龄,和表示了一下,自己是无锁的状态,就没啥信息了。
二、偏向锁状态:
当对象有偏向锁的时候,对象的哈希值没了,反倒是增加了,持有偏向锁的线程ID,和偏向的时间戳,也就是锁的版本号。然后是分代年龄,和锁状态信息。没有哈希值,说明外界访问不到该对象。
三、轻量级锁和重量级锁状态:
轻量级和重量级锁状态除了一个指针,还有锁的状态信息,分代年龄什么的,啥都没了。没有分代年龄,说明这个对象不担心垃圾回收的问题,用完就自动释放内存。

Java-对象头详解相关推荐

  1. 64位JVM的Java对象头详解

    关注"Java艺术"一起来充电吧! 我们编写一个Java类,编译后会生成.class文件,当类加载器将class文件加载到jvm时,会生成一个Klass类型的对象(c++),称为类 ...

  2. Java对象序列化详解6,Java对象的序列化与反序列化详解

    把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种途径: Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 Ⅱ.  在网 ...

  3. Java对象序列化详解

    下面的文章在公众号作了更新:点击查看最新文章 可识别二维码查看更多最新文章: 写在前面 Java对象是在JVM中生成的,如果需要远程传输或保存到硬盘上,就需要将Java对象转换成可传输的文件流. 市面 ...

  4. Java对象初始化详解

    在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.本文试图对Java如何执行对象的初始化做一个详细深入地介绍(与对象初始化相同,类在被加载之后也是需要初始化的,本 ...

  5. Java 对象排序详解

    很难想象有Java开发人员不曾使用过Collection框架.在Collection框架中,主要使用的类是来自List接口中的ArrayList,以及来自Set接口的HashSet.TreeSet,我 ...

  6. Java对象深拷贝详解(List深拷贝)

    1.Java中拷贝的概念 在Java语言中,拷贝一个对象时,有浅拷贝与深拷贝两种 浅拷贝:只拷贝源对象的地址,所以新对象与老对象共用一个地址,当该地址变化时,两个对象也会随之改变. 深拷贝:拷贝对象的 ...

  7. java对象克隆详解

    概述: 当我们new一个对象时,其中的属性就会被初始化, 那么想要保存刚开始初始化的值就靠clone方法来实现, 平时我们最常见的是一个对象的引用指向另一个对象,并不是创建了两个对象. Person ...

  8. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  9. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  10. java对象头_我的并发编程(二):java对象头以及synchronized升级过程

    一.概述 研究java对象头的目的是详细分析Java的synchronized锁的升级过程,因为synchronized在锁升级的时候,就是依赖对象头的信息来决定的.本博文针对64位的操作系统来对Ja ...

最新文章

  1. SUST_ACM_2019届暑期ACM集训热身赛题解
  2. pyhton 安装pip 以及 numpy (解决python:ModuleNotFoundError:No module named numpy 等类似缺包问题
  3. 生鲜水产品牌“仙泉湖”获和智4000万元投资
  4. 讲解Linux数据库安装
  5. java中已定义类型car_Java 8 习惯用语(8):Java 知道您的类型
  6. Asp.Net项目的部署到Linux中(Linux + Jexus+Nginx )
  7. 云计算-My Future, The IT's Future
  8. azure云数据库_如何使用SQL Data Sync同步Azure SQL数据库和本地数据库
  9. python中字符串方法总结
  10. 互联网搜索的哪些环节 机器学习_机器学习、深度学习以及强化学习在金融领域有哪些应用?...
  11. 商城购物车php代码,php网上商城购物车设计代码
  12. C# 网上收集的一些所谓的开源项目
  13. 时间管理(3:SMART原则)
  14. 股市行情图原来是这样实现的
  15. 网页视频怎么录制?这两个方法操作简单,录制高清!
  16. 正方教务系统连接服务器失败,模拟登陆正方教务系统,重定向一直解决不了〉...
  17. 【大数据框架及实战2】---初识
  18. QT精确延时定时函数
  19. 【BPM架构】BPM 平台:独立还是微服务实现
  20. Ios 仿ibooks 翻页效果

热门文章

  1. padStart()和padEnd()使用
  2. 三.N32G003 系统性能测试--dhrystone (IAR环境)
  3. 大数据与Java的关系
  4. 农业物联网发展有哪些问题
  5. Security(安全框架)
  6. DHCP介绍及H3C配置DHCP
  7. Java并发编程进阶——并发锁
  8. SCA连载GDPR罚单之保加利亚国家税务局(NRA)信息泄露事件
  9. pyqt5背景色设置使用css或者是调色板
  10. excel workbook