当前位置: 首页 > news >正文

Java对象头里有哪些信息

在 Java 虚拟机(JVM)中,每个对象的对象头包含了重要的元数据,这些信息用于管理对象的生命周期、同步、垃圾回收等。对象头分为两部分:Mark Word 和 Class Pointer。具体来说,对象头里包含以下信息:

1. Mark Word

Mark Word 是对象头的主要部分,用于存储对象的状态信息。它的内容会根据对象的状态和 JVM 的不同版本有所变化。Mark Word 包括以下信息:

  • 对象哈希码:

    • 对象的哈希码用于对象的哈希计算。哈希码可能在对象的生命周期内发生变化,尤其是在对象的锁状态被改变时。
  • 锁信息:

    • 无锁状态: 对象头的 Mark Word 中没有锁信息。
    • 偏向锁: 偏向锁状态下,Mark Word 中包含偏向线程的 ID,表示该线程拥有锁。
    • 轻量级锁: 轻量级锁状态下,Mark Word 中存储了锁的指针(如自旋锁的记录)。
    • 重量级锁: 重量级锁状态下,Mark Word 包含指向操作系统的线程调度信息(通常是一个指针)。
  • GC 信息:

    • Mark Word 可能包含垃圾回收(GC)相关的信息,例如对象的年龄和分代信息。

2. Class Pointer

Class Pointer 是对象头的第二部分,指向对象的类元数据。这部分包含了对象所属类的 Class 对象的引用。Class 对象存储了与类相关的结构信息,如字段、方法、超类等。

对象头的布局(以 HotSpot JVM 为例)

在 HotSpot JVM 中,对象头的布局可能如下:

  1. 无锁状态:

    • Mark Word 仅包含对象的哈希码。
    • Class Pointer 指向对象的类元数据。
  2. 偏向锁状态:

    • Mark Word 存储了偏向线程的 ID。
    • Class Pointer 仍然指向对象的类元数据。
  3. 轻量级锁状态:

    • Mark Word 存储了锁记录指针。
    • Class Pointer 仍然指向对象的类元数据。
  4. 重量级锁状态:

    • Mark Word 存储了指向操作系统线程调度信息的指针。
    • Class Pointer 仍然指向对象的类元数据。

对象头的具体内容

  • 对象的身份: 包括对象的哈希码和类信息,帮助 JVM 识别和管理对象。
  • 同步信息: 用于实现 synchronized 同步机制,包括锁的状态和信息。
  • 垃圾回收信息: 如对象的年龄和代数,用于垃圾回收策略。

示例

假设我们有一个 Java 对象 myObject,它的对象头可能包含:

  • Mark Word:

    • 哈希码
    • 锁状态(偏向锁、轻量级锁、重量级锁)
    • GC 信息(可能的对象年龄)
  • Class Pointer:

    • 指向 myObject 所属的 Class 对象

总结

Java 对象的对象头包含了用于对象管理和同步的各种信息。它主要包括 Mark WordClass PointerMark Word 用于存储对象的状态信息,如哈希码、锁信息和 GC 信息,而 Class Pointer 指向对象所属的 Class 对象。这些信息是 JVM 内部实现对象管理、同步和垃圾回收等功能的基础。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何在linux系统上部署Redis
  • Android12修改设备名称
  • ARM相关知识概括
  • GitHub的详细介绍
  • python-flask-上传多个文件并存储
  • 有效的字母异位词 | LeetCode-242 | 哈希集合 | 哈希数组
  • LNMP环境搭建论坛
  • 【论文解读】Performance comparison among popular implementations of H.264 encoders
  • 【Bug分析】Keil报错:error: #18:expected a “)“问题解决
  • OpenGL入门一:基础知识及概念
  • [C++] 深入理解面向对象编程特性 : 继承
  • 大数据-72 Kafka 高级特性 稳定性-事务 (概念多枯燥) 定义、概览、组、协调器、流程、中止、失败
  • Network Address Translation,网络地址转换技术
  • 探索HTML5新特性:创建一个多媒体网页
  • Spring Boot 整合 SA-Token 使用详解
  • JavaScript-Array类型
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • JS数组方法汇总
  • scrapy学习之路4(itemloder的使用)
  • SpiderData 2019年2月25日 DApp数据排行榜
  • SpringCloud集成分布式事务LCN (一)
  • Swoft 源码剖析 - 代码自动更新机制
  • 听说你叫Java(二)–Servlet请求
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • ​如何在iOS手机上查看应用日志
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #、%和$符号在OGNL表达式中经常出现
  • $forceUpdate()函数
  • (21)起落架/可伸缩相机支架
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (独孤九剑)--文件系统
  • (二)丶RabbitMQ的六大核心
  • (六)c52学习之旅-独立按键
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原創) 未来三学期想要修的课 (日記)
  • (源码分析)springsecurity认证授权
  • (转载)(官方)UE4--图像编程----着色器开发
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET命令行(CLI)常用命令
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .Net语言中的StringBuilder:入门到精通
  • .Net中的集合
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @RequestMapping处理请求异常
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • @Transactional事务注解内含乾坤?
  • [ 数据结构 - C++]红黑树RBTree
  • [100天算法】-实现 strStr()(day 52)
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [20180224]expdp query 写法问题.txt
  • [Android]使用Retrofit进行网络请求