Java-对象头详解
引言
这里只介绍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-对象头详解相关推荐
- 64位JVM的Java对象头详解
关注"Java艺术"一起来充电吧! 我们编写一个Java类,编译后会生成.class文件,当类加载器将class文件加载到jvm时,会生成一个Klass类型的对象(c++),称为类 ...
- Java对象序列化详解6,Java对象的序列化与反序列化详解
把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种途径: Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 Ⅱ. 在网 ...
- Java对象序列化详解
下面的文章在公众号作了更新:点击查看最新文章 可识别二维码查看更多最新文章: 写在前面 Java对象是在JVM中生成的,如果需要远程传输或保存到硬盘上,就需要将Java对象转换成可传输的文件流. 市面 ...
- Java对象初始化详解
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.本文试图对Java如何执行对象的初始化做一个详细深入地介绍(与对象初始化相同,类在被加载之后也是需要初始化的,本 ...
- Java 对象排序详解
很难想象有Java开发人员不曾使用过Collection框架.在Collection框架中,主要使用的类是来自List接口中的ArrayList,以及来自Set接口的HashSet.TreeSet,我 ...
- Java对象深拷贝详解(List深拷贝)
1.Java中拷贝的概念 在Java语言中,拷贝一个对象时,有浅拷贝与深拷贝两种 浅拷贝:只拷贝源对象的地址,所以新对象与老对象共用一个地址,当该地址变化时,两个对象也会随之改变. 深拷贝:拷贝对象的 ...
- java对象克隆详解
概述: 当我们new一个对象时,其中的属性就会被初始化, 那么想要保存刚开始初始化的值就靠clone方法来实现, 平时我们最常见的是一个对象的引用指向另一个对象,并不是创建了两个对象. Person ...
- 4.6 W 字总结!Java 11—Java 17特性详解
作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...
- java多线程学习-java.util.concurrent详解
http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...
- java对象头_我的并发编程(二):java对象头以及synchronized升级过程
一.概述 研究java对象头的目的是详细分析Java的synchronized锁的升级过程,因为synchronized在锁升级的时候,就是依赖对象头的信息来决定的.本博文针对64位的操作系统来对Ja ...
最新文章
- SUST_ACM_2019届暑期ACM集训热身赛题解
- pyhton 安装pip 以及 numpy (解决python:ModuleNotFoundError:No module named numpy 等类似缺包问题
- 生鲜水产品牌“仙泉湖”获和智4000万元投资
- 讲解Linux数据库安装
- java中已定义类型car_Java 8 习惯用语(8):Java 知道您的类型
- Asp.Net项目的部署到Linux中(Linux + Jexus+Nginx )
- 云计算-My Future, The IT's Future
- azure云数据库_如何使用SQL Data Sync同步Azure SQL数据库和本地数据库
- python中字符串方法总结
- 互联网搜索的哪些环节 机器学习_机器学习、深度学习以及强化学习在金融领域有哪些应用?...
- 商城购物车php代码,php网上商城购物车设计代码
- C# 网上收集的一些所谓的开源项目
- 时间管理(3:SMART原则)
- 股市行情图原来是这样实现的
- 网页视频怎么录制?这两个方法操作简单,录制高清!
- 正方教务系统连接服务器失败,模拟登陆正方教务系统,重定向一直解决不了〉...
- 【大数据框架及实战2】---初识
- QT精确延时定时函数
- 【BPM架构】BPM 平台:独立还是微服务实现
- Ios 仿ibooks 翻页效果