【JUC】Java对象内存布局和对象头
文章目录
- 面试题
- Object object = new Object() 谈谈你对这句话的理解?
- 对象在堆内存中存储布局
- 权威定义(周志明老师JVM第三版)
- 对象在堆内存中的存储布局
- 详解对象头的MarkWord
- 源码
- 对象标记源码
- 对象内存布局(使用JOL证明)
- 依赖
- 只有对象头对象的内存布局信息
- 运行结果展示
- 压缩指针
- 有实例数据的对象的内存布局信息
- 文章说明
面试题
- 对象头存储那些信息?长度是多少位存储?
Object object = new Object() 谈谈你对这句话的理解?
- 位置所在:JVM堆->新生区->伊甸园区


- 对象的构成要素?构成布局:对象头+实例数据+对齐填充
对象在堆内存中存储布局
权威定义(周志明老师JVM第三版)
在HotSpot虚拟机里,对象在堆内存的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data) 和对齐填充(Padding)。

对象在堆内存中的存储布局


-
**对象头:**在64位系统中,Mark Word占了8个字节,类型指针占了8个字节(开启压缩指针的话,有时候会压缩到4个字节),一共是16个字节)
- 对象标记(Mark Word)
- 下面详解
- 类元信息(klassOop类型指针)
- 类元信息存储指向该对象类元数据(klass)的地址,虚拟机通过这个指针来确定这个对象哪个类的实例
- 对象标记(Mark Word)
-
实例数据
- 存放类的属性(Field)数据信息,包括父类的属性信息

- 存放类的属性(Field)数据信息,包括父类的属性信息
-
对齐填充(保证8个字节的倍数)
- 虚拟机要求对象起始地址必须是8字节的整数倍,填充数据不是必须存在的,仅仅是为了字节对齐,这部分内存按8字节补充对齐。
- 例如有一个对象内存是21个字节,会填充到24个字节
详解对象头的MarkWord
先思考如下问题:
- new一个时象,占内存多少?
对象名.hashcode():这个hashcode记录在对象的什么地方?synchronized(o):怎么知道锁了多少次?system.gc():手动收集垃圾,15次可以从新生代->老年代,哪里记录了分代年龄?
上述信息都存储在MarkWord中。默认存诸对象的HashCode、分代年龄和锁标志位等信息。这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化

通过看标志位,就能获取存储内容的状态

32位虚拟机,不用深入学习,了解即可,现在都有64位

在64位虚拟机中,Mark Word占了8个字节(64bit),类型指针占了8个字节,一共是16个字节。new一个最简单的Object,没有实例数据这些,这个对象就是16字节。

- 分代年龄的存储空间是4bit,最多只能存储到15,到达15,对象就需要从新生代晋升到老年代
尝试强制设置为16

代码运行就会报错

源码
_mark字段是mark word,_metadata是类指针klass pointer,对象头(object header)即是由这两个字段组成

对象标记源码
- hash: 保存对象的哈希码
- age:保存对象的分代年龄
- biased_lock:偏向锁标识位
- lock:锁状态标识位
- JavaThread*:保存持有偏向锁的线程ID
- epoch:保存偏向时间戳

对象内存布局(使用JOL证明)
JOL官网:https://openjdk.org/projects/code-tools/jol/
JOL = Java Object Layout。JOL(Java对象布局)是一个小型工具箱,用于分析JVM中的对象布局方案。这些工具大量使用Unsafe、JVMTI和服务性代理(SA),以解码实际的对象布局、占用空间和引用。这使得JOL比其他依赖于堆转储、规范假设等的工具更准确。(注:Unsafe、JVMTI和Serviceability Agent(SA)都是Java中的一些技术或工具。)
依赖
<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.9</version>
</dependency>
System.out.println(VM.current().details());打印当前虚拟机的信息

只有对象头对象的内存布局信息
运行结果展示
Object只有对象头,没有任何实例数据


没有属性的自定义类默认也是16字节

压缩指针
Java -XX:+PrintCommandLineFlags -version查看当前虚拟机信息- 默认开启压缩指针(+表示开启),开启后将上述类型指针压缩为4字节,以节约空间

- 手动关闭压缩指针: -XX: -UseCompressedClassPointers(-表示关闭)

【总结】
1、默认配置,启动了压缩指针,-XX:+UseCompressedClassPointers,12 + 4(对齐填充) = 一个对象16字节 2、手动配置,关闭了压缩指针,-XX:-UseCompressedClassPointers,8 + 8 = 一个对象16字节
有实例数据的对象的内存布局信息
public class JOLDemo {public static void main(String[] args) {Object o = new Object();//16 bytesCustomer c1 = new Customer();//16 bytesSystem.out.println(ClassLayout.parseInstance(c1).toPrintable());}
}class Customer//16字节(忽略压缩指针的影响)+4字节+1字节=21字节----》对其填充,24字节
{//2 第二种情况,int + boolean,默认满足对其填充,24 bytesint id;boolean flag = false;boolean flag2 = false;
}

文章说明
该文章是本人学习 尚硅谷 的学习笔记,文章中大部分内容来源于 尚硅谷 的视频尚硅谷JUC并发编程(对标阿里P6-P7),也有部分内容来自于自己的思考,发布文章是想帮助其他学习的人更方便地整理自己的笔记或者直接通过文章学习相关知识,如有侵权请联系删除,最后对 尚硅谷 的优质课程表示感谢。
相关文章:
【JUC】Java对象内存布局和对象头
文章目录 面试题Object object new Object() 谈谈你对这句话的理解? 对象在堆内存中存储布局权威定义(周志明老师JVM第三版)对象在堆内存中的存储布局详解对象头的MarkWord源码对象标记源码 对象内存布局(使用JOL证明)…...
简单介绍一下css中transform的内容
在CSS中,transform属性用于对元素进行变换,包括旋转、缩放、倾斜和平移等操作。以下是transform属性中常用的属性: translate:用于元素的平移操作,可以指定元素在X轴和Y轴方向上的平移距离。 rotate:用于元…...
C 循环
C 循环 在C编程语言中,循环是一种控制结构,它允许我们重复执行一段代码多次。这是编程中非常基础且强大的功能,广泛应用于各种算法和数据处理的场景中。本文将详细介绍C语言中的循环概念,包括不同类型的循环语句及其使用方法。 …...
什么是设计模式?一文理解,通俗易懂!
前言 最近在学框架的时候,老师总是时不时带两句设计模式,什么工厂模式,单例模式,开发框架用到就提一嘴,但是没有细讲,为了搞懂啥是设计模式,为哈开发框架用到它,我就查找资料&#…...
doxygen制作接口文档
系列文章目录 文章目录 系列文章目录前言一、下载二、安装三、代码注释四、使用doxygen生成文档 前言 每次手动写接口文档太痛苦了,现在福利来了–doxygen Doxygen是软件开发中广泛使用的文档生成器工具。它自动从源代码注释生成文档,解析有关类、函数和…...
PDF怎么在线转Word?介绍四种转换方案
PDF怎么在线转Word?在数字化办公时代,文档的互换性变得尤为重要。PDF格式因其跨平台兼容性和版面固定性而广受欢迎,但有时我们可能需要将PDF文件转换为Word文档,以便进行编辑或进一步处理。以下是四种常见的在线PDF转Word的方法&a…...
大数据应用型产品设计方法及行业案例介绍(可编辑110页PPT)
引言:随着信息技术的飞速发展,大数据已成为推动各行各业创新与变革的重要力量。大数据应用型产品,作为连接海量数据与实际应用需求的桥梁,其设计方法不仅要求深入理解数据特性,还需精准把握用户需求,以实现…...
【Python零基础学习】Python环境安装和IDE选择
文章目录 前言一、Python介绍二、Python下载安装三、IDE选择VS CodePyCharm 四、打印Hello Python World使用cmd使用VS Code 总结 前言 本文是笔者学习Python语言的开篇文章了,Python语法相对比较简单,对编程初学者而言十分友好,应用极其广泛…...
【langchain学习】使用LangChain创建具有上下文感知的问答系统
探讨如何使用LangChain库创建一个上下文感知的问答系统。这个系统能够根据用户的聊天历史,将当前问题转化为一个独立的问题,接着根据上下文提供准确的答案。 1. 导入所需模块 from operator import itemgetter from config import llm # 从config文件…...
原神4.8版本升级计划数据表
原神4.8版本角色数据升级计划表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原神4.8版本升级计划…...
海南云亿商务咨询有限公司放大电商品牌影响力
在数字化浪潮席卷全球的今天,电商行业以其独特的魅力和无限潜力,成为了推动经济发展的重要力量。而在这片浩瀚的电商海洋中,抖音电商以其独特的短视频直播模式,迅速崛起为一颗璀璨的新星,引领着新一轮的消费潮流。作为…...
用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)
exceljs在Jquery(HTML)和vue项目中实现导出功能 前言Jquery(HTML)中实现导出第一步,先在项目本地中导入exceljs和file-saver包第二步,封装导出Excel方法(可直接复制粘贴使用)第三步&…...
TIA博途_下载时提示密码错误,但是之前并没有设置过密码的解决办法
TIA博途_下载时提示密码错误,但是之前并没有设置过密码的解决办法 如下图所示,下载程序时提示:在线检查保护机密PLC组态数据的密码时出错。 原因: 自 TIA Portal V17 起,新增了安全向导用于帮助客户快速进行安全相关的设置。即保护机密的PLC组态数据功能导致出现下载异常。…...
使用消息队列、rocketMq实现通信
1背景 springboot框架, 2需求 后端需要调用一个类似于api这种作用的小工具,获得工具的返回值,后端再根据客户端的返回值进行更新数据操作 3讨论 1工具开发者使用的是python,将工具封装起来,暴露成web接口供后端调用 2方式一能…...
通过LLM大模型将「白雪公主的故事」转为图数据存储
💡 本次将使用LLM大模型将「白雪公主的故事」转为图数据存储于neo4j数据库中,并展示图数据部分的效果 故事内容 很久很久以前,在一个遥远的王国里,有一位美丽的**王后**生下了一个皮肤像雪一样白皙、嘴唇像血一样鲜红的**女儿**…...
MyBatisPlus 第一天
数据库创建表 CREATE DATABASE mybatis_plus /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use mybatis_plus; CREATE TABLE user ( id bigint(20) NOT NULL COMMENT 主键ID, name varchar(30) DEFAULT NULL COMMENT 姓名 , age int(11) DEFAULT NULL COMMENT 年龄 , email va…...
线程与多线程(二)
线程与多线程(二) 一、线程互斥1、相关概念 二、互斥锁1、介绍2、使用场景3、初始化(1)函数(2)概念 4、销毁(1)函数(2)概念 5、加锁(1)…...
算法板子:欧拉函数——求一个数的欧拉函数、线性时间内求1~n所有数的欧拉函数
目录 1. 欧拉函数 (1)概念 (2)性质 (3)计算公式 2. 求一个数的欧拉函数 (1)模拟过程 (2)代码 3. 线性时间内求1~n所有数的欧拉函数——筛法求欧拉函…...
2024牛客暑期多校训练营8
文章目录 A. Haitang and GameE.Haitang and MathJ. Haitang and TriangleK. Haitang and Ava A. Haitang and Game 通过审题可以知道,最后的胜者和若干次操作后最多能增加的数的奇偶有关。 由于 a i a_i ai 较小,所以我们枚举每一个没出现过的 x …...
git的一些操作指令
一、git 提交规范 commit message subject : 空格 message 主体 feat: 新功能(feature)用于提交新功能。fix: 修复 bug用于提交 bug 修复。docs: 文档变更用于提交仅文档相关的修改。style: 代码风格变动(不影响代码逻辑&…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
