JVM —— Object Header(对象头)
来源:互联网 发布:ubuntu开启samba服务 编辑:程序博客网 时间:2024/06/06 05:44
HotSpot 虚拟机的对象头包括两部分信息:Mark Word(标记字段)和 Klass Pointer(类型指针)
1. Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等等。JVM 对象头一般占用两个机器码,在 32-bit JVM 上占用 64bit, 在 64-bit JVM 上占用 128bit 即 16 bytes(暂不考虑开启压缩指针的场景)。另外,如果对象是一个 Java 数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通 Java 对象的元数据信息确定 Java 对象的大小,但是从数组的元数据中无法确定数组的大小。
对象需要存储的运行时数据很多,其实已经超出了32、64位 Bitmap 结构所能记录的限度,但是对象头信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word 被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。例如在 32 位的HotSpot 虚拟机中对象未被锁定的状态下,Mark Word 的 32个Bits 空间中的 25Bits 用于存储对象哈希码(HashCode),4Bits 用于存储对象分代年龄,2Bits 用于存储锁标志位,1Bit固定为0,在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容如下表所示。
HotSpot 虚拟机对象头 Mark Word
存储内容
标志位
状态
对象哈希码、对象分代年龄
01
未锁定
指向锁记录的指针
00
轻量级锁定
指向重量级锁的指针
10
膨胀(重量级锁定)
空,不需要记录信息
11
GC标记
偏向线程ID、偏向时间戳、对象分代年龄
01
可偏向
- Klass Pointer,即是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
参考资料:
http://stackoverflow.com/questions/26357186/what-is-in-java-object-header
《深入理解 Java 虚拟机:JVM 高级特性与最佳实践》
http://blog.csdn.net/wenniuwuren/article/details/50939410
阅读全文
0 0
- JVM —— Object Header(对象头)
- JVM —— Object Header(对象头)
- 面向对象—Object
- header 头
- JVM(4)——对象访问
- javaScript——Object对象
- 面向对象——object
- 显示当前浏览器头信息(HEADER)
- Object Diagram(对象图)——UMl
- Java面向对象——包(package) Object 类
- 走进Scala——伴生对象(Companion Object)
- 走进Scala——伴生对象(Companion Object)<转>
- 黑马程序员——面向对象(Object类)
- Object-C基础(7)——类与对象
- 走进Scala——伴生对象(Companion Object)
- Unity内存管理——对象池(Object-Pool)
- C++11系列——函数对象(Function Object)
- C#类和对象(十)——Object类
- AngularJS 学习
- 求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。
- 分布式作业 gossip模式
- 2018年 java面试跳槽必备
- cpp: ostream setf() 设置格式状态方法的初使用
- JVM —— Object Header(对象头)
- xgboost安装问题:动态库
- SpringMVC学习记录(四)--文件上传与下载
- Ubuntu 阿里源更新 && nvidia驱动安装 && cuda 安装
- 01-nodeJs下载及安装
- Java BAT大型公司面试专属必备技能视频教程
- python requests的安装与简单运用
- Java Web知识点总结——JSP脚本和指令的使用
- 寻找zcmu(upper_bound算法)