Java对象头

devtools/2024/10/22 12:20:08/

Java对象头

  • 对象头结构
  • 对象头和JVM的思考

对象头结构

Java对象的对象头主要由两部分组成:

  1. Mark Word:用于存储对象的运行时数据,包括哈希码、GC年龄、锁状态等。
  2. Class Metadata Address:指向对象的类元数据的指针,JVM用它来找到类信息。
32位JVM64位JVM
Mark Word3264(当开启压缩指针,仍然保持32位)
Class Metadata Address3264(当开启压缩指针,仍然保持32位)
无锁
| 25 bits (unused) | 4 bits (age) | 31 bits (identity hash code) | 4 bits (00) |
偏向
| 54 bits (thread ID) | 2 bits (epoch) | 4 bits (age) | 1 bit (0) | 3 bits (101) |
轻量
| 62 bits (lock record pointer) | 2 bits (00) |
重量
| 62 bits (monitor pointer) | 2 bits (10) |

Mark Word的后几位来记录对象的锁状态,即标识当前对象是否被线程独享。这些标志位不仅指示了锁的类型,还帮助JVM管理并发和同步操作。

无锁状态(00):

  • 对象没有被任何线程锁定。
  • 在这种状态下,Mark Word中包含对象的标识哈希码、GC age等信息。

偏向锁(101):

  • 对象被一个线程偏向锁定,这意味着对象倾向于被同一个线程多次锁定。
  • Mark Word中包含偏向锁线程的ID和其他相关信息。

轻量级锁(00):

  • 对象被多个线程竞争锁定,锁是轻量级的(基于CAS操作)。
  • Mark Word中包含指向锁记录的指针。

重量级锁(10):

  • 对象被多个线程竞争锁定,锁是重量级的(通过操作系统的互斥量(mutex)来实现线程的挂起和唤醒)。
  • Mark Word中包含指向互斥量的指针。
    上述锁状态的转换其实就是对象锁(监视器锁)的升级过程:无锁 - 偏向 - 轻量 - 重量。
    // todo关于锁

对象头和JVM的思考

  1. 对象头中包含GC age,独占当前对象的线程信息,还有指向类的元信息的地址,因此JVM可以通过分代进行GC,可以控制并发安全,可以通过类的元信息进行反射;
  2. JVM堆区中存放实例对象,实例对象包含:
  • 普通实例对象 如:person、dog
  • class实例对象 如 person.class dog.class class.class
    这些对象都有对象头,我们知道对象头中有一个区域用来存放指向类的元数据的内存地址,这个区域是Class Metadata Address。
    普通对象对象头的Class Metadata Address:指向的是对应的class对象的地址,因为class对象是该类访问元数据的入口。如下图:
(Heap):
------------------------------------------------------
| person对象                                          |
|----------------------------------------------------|
| 对象头:                                             |
|  - Mark Word                                        |
|  - Class Metadata Address (指向Person.class实例)     |找它的模板类
|----------------------------------------------------|| Person.class对象                                    |
|----------------------------------------------------|
| 对象头:                                             |
|  - Mark Word                                        |
|  - Class Metadata Address (指向java.lang.Class实例)  |找它的模板类
|----------------------------------------------------|| java.lang.Class.class对象                           |
|----------------------------------------------------|
| 对象头:                                             |
|  - Mark Word                                        |
|  - Class Metadata Address (指向自己)                 |
|----------------------------------------------------|元空间 (Metaspace):
------------------------------------------------------
| Person类元数据                                      |
|----------------------------------------------------|| java.lang.Class类元数据                             |
|----------------------------------------------------|

http://www.ppmy.cn/devtools/87641.html

相关文章

[护网杯 2018]easy_tornado1

打开题目 看到三个txt文件,分别打开这三个文件 flag在flllllllag里面 这里给出了一个加密方式,结合url中的filehash,可知要获取flag需要先获取cookie_secret,并将其与/fllllllllllllag组合加密输入到filehash中。猜测是tornado模…

springboot民办高校科研项目管理系统-计算机毕业设计源码54009

摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存…

C++重载递增运算符

#include<iostream> using namespace std;class MyInteger {friend ostream& operator<<(ostream& out, MyInteger myint); public:MyInteger(){m_Num 0;}//前置 MyInteger& operator(){m_Num;return *this;}//后置 MyInteger operator(int)//占位参…

个性化你的生产力工具:待办事项App定制指南

国内外主流的10款待办事项软件对比&#xff1a;PingCode、Worktile、滴答清单、番茄ToDo、Teambition、Todoist、Microsoft To Do、TickTick、Any.do、Trello。 在寻找合适的待办事项软件时&#xff0c;你是否感到选择众多、难以决断&#xff1f;一个好的待办事项工具可以大大提…

Python笔试面试题AI答之面向对象(3)

文章目录 12.Python中OOPS是什么&#xff1f;1. 类&#xff08;Class&#xff09;2. 对象&#xff08;Object&#xff09;3. 面向对象编程的主要特性4. 面向对象编程的优点 13.解释一下Python中的继承&#xff1f;继承的基本语法继承的特性继承的类型 14. 什么是封装&#xff1…

Hive3:库操作常用语句

1、创建库 create database if not exists myhive;2、选择库 use myhive;3、查看当前选择的库 SELECT current_database();4、查看库详细信息 desc database myhive;可以查看数据文件在hdfs集群中的存储位置 5、创建库时制定hdfs的存储位置 create database myhive2 …

TI音频功放TAS6511(一)

一、简要描述 TAS6511-Q1是一款单声道数字输入D类音频放大器&#xff0c;支持2 MHz开关频率&#xff0c;可实现成本和尺寸优化的单声道解决方案。该芯片的工作电压范围为4.5V至18V&#xff0c;可提供高达30W&#xff08;14.4V&#xff0c;4Ω&#xff0c;10%失真率&#xff09…

Redis主从复制、哨兵模式、集群

一、redis集群三种模式&#xff1a; 1.主从复制&#xff1a;最少3台&#xff0c;一主两从 redis主从复制与mysql主从复制类似&#xff0c;主可以写&#xff0c;写入主的数据通过RDB方式把数据同步到从服务器&#xff0c;从不能更新到主&#xff0c;也是哨兵模式的基础。 缺点…