【JUC】Java对象内存布局和对象头

news2024/11/24 17:37:32

【JUC】Java对象内存布局和对象头

文章目录

  • 【JUC】Java对象内存布局和对象头
    • 1. 对象的内存布局
      • 1.1 对象头
        • 1.1.1 对象标记
        • 1.1.2 类元信息/类型指针
      • 1.2 实例数据
      • 1.3 对齐填充
    • 2. 测试

1. 对象的内存布局

在 HotSpot 虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:

  1. 对象头(Header)
  2. 实例数据(Instance Data)
  3. 对齐填充(Padding)

image-20230521224650686

1.1 对象头

对象头包含两个部分:

  • 对象标记(Mark Word)
  • 类元信息(又称类型指针)

1.1.1 对象标记

对象标记中包括以下信息:

  1. 对象的哈希码:在Java中,每个对象都有一个唯一的哈希码,用于识别该对象。
  2. 对象的锁状态:Java中的对象可以被加锁以进行线程同步。对象标记中的锁状态信息记录了该对象是否被加锁。
  3. GC相关信息:Java的垃圾回收器需要知道每个对象是否可达,以便决定是否回收该对象。对象标记中存储了与垃圾回收相关的信息,例如对象是否被标记为可达或已经被回收。

image-20230521230227552

image-20230521234157902

在64位系统中,Mark Word 占了8个字节,类型指针占了8个字节,一共是16个字节。

问:创建一个Object对象占用了多少字节?

答:一个普通的object对象没有实例数据,所以只有对象标记和类型指针加起来的的大小,也就是16字节。

Mark Word 被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间Mark Word 里存储的数据会随着锁标志位的变化而变化。


1.1.2 类元信息/类型指针

**类型指针(Class Pointer)**就是用来指向该对象的类元数据信息的指针。它指向的是该对象所属的类的Class对象。这个指针是一个内存地址,可以用来确定该对象所属的类以及该类的方法和属性等信息。

在32位的JVM中,Class Pointer占用4个字节;在64位的JVM中,Class Pointer占用8个字节。它是对象头中比较重要的一个字段,因为它可以帮助虚拟机确定这个对象是哪个类的示例,从而进行方法调用、对象实例化等操作。

image-20230521231458776


对象头有多大?

答:在64位系统中,mark wordclass pointer 都占8个字节,所以对象头的大小为16个字节。


1.2 实例数据

存放类的属性(Field)数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。

示例:

class Customer{
    int id;
    boolean flag = true;
}

创建一个 Customer 对象,实例数据(int占4个字节,boolean占1个字节)共5个字节


1.3 对齐填充

虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐,这部分内存按8字节补充对齐。

如 1.2 示例所示:创建一个 Customer 对象,对象头16个字节,实例数据5个字节,所以对象头+实例数据=21个字节。对齐填充之后,对象的大小为24个字节。


2. 测试

使用 JOL(Java Object LayOut)分析对象在JVM的大小和分布

image-20230522000335455

为什么这里类型指针大小是4字节而不是8字节呢?之后会说明。


为什么GC年龄最大为15?

因为GC年龄采用4位bit存储,所以最大为15,例如 MaxTenuringThreshold 参数默认值就是15。如果我们将其改成16会怎样?

设置jvm参数 -XX:MaxTenuringThreshold=16 ,运行任意一个程序,结果如下:

image-20230522001012200


为什么运行结果中类型指针的大小是4字节而不是8字节呢?

image-20230522002426979

在控制台中输入 java -XX:+PrintCommandLineFlags -version 指令,回车,控制台显示如下内容:

image-20230522001415163

-XX:+UseCompressedClassPointers 表示开启了类型指针压缩,以节约空间。

默认配置:启动了压缩指针,-XX:+UseCompressedClassPointers,12 + 4(对齐填充) = 一个对象16字节。

手动配置:关闭了压缩指针,-XX:-UseCompressedClassPointers, 8 + 8 = 一个对象16字节。

乍看之下好像压了等于没压,实际上不是:

一个Person类中,有两个boolean类型的成员变量。

默认配置:启动了压缩指针,对象头是12个字节,实例数据2个字节,那么这个对象大小就是 12 + 2 + 2(对齐填充) = 16字节。

手动配置:关闭了压缩指针,对象头是16个字节,实例数据2个字节,那么这个对象大小就是 16 + 2 + 6(对齐填充) = 24字节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MSP432学习笔记6:中断优先级管理

所用型号:MSP432P401R 今日继续我的MSP432电赛速通之路。 主要学习的是:中断优先级管理、软件挂起中断、屏蔽中断优先级 目录 MSP432具有8级可编程的中断优先级。 中断优先级管理库函数: 软件挂起中断: 屏蔽中断优先级&#…

微信小程序富文本插件mp-html

使用场景: 偏偏后端传过来的数据又要用到富文本标签,然后找了很多组件,要不就是下载量低,要不就是里面功能太少,只有这款mp-html组件深得我心,里面功能丰富,简单实用,真的绝绝子&…

DMA直接存储器存取

目录 存储器映像 寄存器 DMA框图 DMA基本结构 DMA请求映射 数据宽度与对齐 ​编辑 存储器到存储器 ​编辑 外设与存储器 来源b站江科大stm3入门教程 存储器映像 寄存器 DMA框图 AHB从设备(DMA自身的寄存器)连接在总线矩阵右侧的AHB总线上 所以DMA既…

LeetCode:509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

509. 斐波那契数 题目 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),…

无底线内卷?谈谈如何在职场中实现人生巅峰

在竞争激烈的职场上,各种职场难题时常出现,如何进行有效沟通、如何应对工作压力、如何提升职业能力等,这都是需要去克服的问题。 1. 尝试人际沟通A:TO 企业B:TO 员工 2. 适应工作压力A:原因B:TO…

ROS2 入门应用 创建启动文件(C++)

ROS2 入门应用 创建启动文件(C) 1. 创建功能包2. 添加依赖关系3. 添加编译信息4. 创建启动文件4.1. Python4.2. XML4.3. YAML 5. 编译和运行 1. 创建功能包 用Python、XML或YAML编写的启动文件可以启动和停止不同的节点,以及触发和处理各种事…

法规标准-GB/T 39323标准解读(2020版)

GB/T 39323是做什么的? GB/T 39323全称为乘用车车道保持辅助(LKA)系统性能要求及试验方法,其中主要描述了LKA系统的功能要求及测试要求 一般要求 1.系统应能在状态良好的车道边线环境下识别车辆与车道边线的相对位置,辅助驾驶员将车辆保持…

76.建立一个主体样式第二部分

上节课的时候我们完成的页面是这个样子! ● 之后我们通过绝对定位来解决位置定位的问题 .header-container {width: 1200px;margin: 0 auto;position: absolute;left: 50%;top: 50%; }header {height: 100vh;background-color: orange;position: relative; }● 之…

通过Python的PyPDF2库提取pdf中的文字

文章目录 前言一、PyPDF2库是什么?二、安装PyPDF2库三、查看PyPDF2库版本四、使用方法1.引入库2.定义pdf路径3.打开PDF文件4.创建PDF阅读器对象5.获取PDF文件中的页数6.遍历每一页7.获取当前页内容8.提取当前页文本9.打印当前页文本10.效果 总结 前言 一、PyPDF2库…

【2023 · CANN训练营第一季】初识新一代开发者套件 Atlas 200I DK A2---介绍Atlas 200I DK A2的基本使用

1.Atlas 200I DK A2开发者套件板介绍 应用场景:昇腾AI开发者上手学习、实践创新场景,提供配套软硬件 关键特性规格描述形态135mm120mm44mmAI 算力整数精度(INT8):8 TOPS 半精度(FP16): 4 TFLOPS摄像头接口2* MIPI - CSI 支持两个…

研报精选230521

目录 【行业230521山西证券】煤炭行业周报:量减需增进口倒挂,煤炭价格企稳反弹 【行业230521东吴证券】大炼化周报:油价弱势震荡,下游表现疲软 【行业230521东海证券】4月社零报告专题:低基数下创新高,实质…

MyBatisX

文章目录 MyBatisXMybatis带参方法 动态条件查询多条件查询多条件-动态条件查询ifchoose(when,otherwise) 添加添加-主键返回 修改修改全部字段修改动态字段 删除MyBatis参数传递多个参数单个参数 MyBatis注解完成增删改查 MyBatisX pojo类中的属性名要和数据库中的一致才能实现…

ARM学习笔记_2 模式,寄存器,流水线

ARM arm体积小功耗低性能高,支持thumb ARM双指令集,兼容8/16位器件;大量使用寄存器,指令定长,寻址简单。 ARM是32位架构,Word 32bit, half Word 16bit. 模式 用户模式是用户程序的模式&#…

RK3568平台开发系列讲解(驱动基础篇)RK平台IR的使用

🚀返回专栏总目录 文章目录 一、红外遥控配置二、内核驱动2.1 DTS 定义键值表2.2 内核用户码和IR键值的获取2.3 编译 IR 驱动进内核2.4 Android 键值映射三、IR 波形沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将对RK IR的使用进行学习。 一、红外遥控配置 …

解决插件加载动态库的冲突问题

最近发给用户的插件在使用过程中,UI界面一直未能加载成功,分析后发现和其他的插件发生冲突了,同时用到了一个UI库:MahApps.Metro(自己改造过的版本)。 分析过程中使用ProcessExplorer查看Revit运行过程中所…

二叉树最大宽度-广度优先方式 -队列应用_20230520

二叉树最大宽度-广度优先(BFS)方式 -队列应用 前言 上一遍介绍了求解二叉树最大宽度的DFS解法,求解的核心主要是对根节点、左孩子及右孩子的宽度取最大值,通过赋值给根节点后,然后通过递归栈层层返回,当返回至树的根节点上的时候…

数字图像处理—图像分割算法详解(边缘检测、阈值处理)

前言 令R表示一幅图像占据的整个空间区域。图像分割:把R分为n个子区域R1,R2,…,Rn的过程,满足 点、线、边缘检测 背景知识 一阶导数的近似要求: (1)在恒定灰度区域必须为零 (2)在灰度台阶或…

【连续介质力学】张量值张量函数

张量值张量函数 张量值张量函数有以下类型:标量,向量和高阶张量 标量值张量函数: Ψ Ψ ( T ) det ⁡ T Ψ Ψ ( T , S ) T : S \Psi \Psi(T) \det T \\ \Psi \Psi(T,S) T:S ΨΨ(T)detTΨΨ(T,S)T:S 其中, T , S T, S …

【JavaEE】MyBatis + 单元测试

目录 MyBaits项目的创建使用 引入相关依赖 配置文件设置 数据库连接 配置XML路径 映射器文件模板 业务代码实例 创建实体类 添加Mapper接口创建映射器 验证是否成功 MyBatis原理 什么是MyBatis 为什么学习MyBatis MyBatis工作原理 单元测试 前置工作 生成测试…

Selenium是什么,带你了解自动化测试的神奇之处

一、使用测试工具 工欲善其事,必先利其器。在开始具体的自动化测试之前,我们需要做好更多的准备,包括以下几个方面: 认识自动化测试 准备自动化测试工具 使用有效的方式 针对具体的测试对象 接下来的第一部分内容,我…