Java对象内存布局及对象头详解

news2024/9/21 14:44:05

对象在堆内存中布局

平常我们都在使用对象,现在从底层角度来分析下java对象的内存布局,以及对象布局各部分含义。

周志明老师JVM第三版的定义

在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。

image-20230209163538413

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

image-20230209163600912

对象内部结构分为:对象头、实例数据、对齐填充(保证8个字节的倍数)。
对象头分为对象标记(markOop)和类元信息(classOop),类元信息存储的是指向该对象类元数据(class)的首地址。

1. 对象头

对象标记Mark Word

用于存储对象自身的运行时数据,如哈希码(hashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等。占用空间大小根据JVM决定,为JVM的一个字大小,也就是32位JVM中Mark Word占用4个字节,64位JVM中占用8个字节64位。

为了节省空间,Mark Word是以非固定的数据结构来存储。具体数据结构如下:

image-20230209163824240

32bit JVM:

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

image-20230209163942110

默认存储对象的HashCode、分代年龄和锁标志位等信息。
这些信息都是与对象自身定义无关的数据,所以MarkWord被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间MarkWord里存储的数据会随着锁标志位的变化而变化。

类元信息(又叫类型指针)

image-20230209164452503

对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

2. 实例数据

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

3. 对齐填充

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

官网理论

参考:

Hotspot术语表官网

底层源码理论证明

聊聊Object obj = new Object() new一个对象占多少内存空间

使用工具包可以查看对象在堆中的储存结构:

<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.16</version>
</dependency>

查看空类对象在堆中的储存结构

public class JOLDemo
{
    public static void main(String[] args)
    {
        Object o = new Object();
        //获取对象内部信息
        System.out.println( ClassLayout.parseInstance(o).toPrintable());
    }
}

image-20230209165509150

OFFSET偏移量,也就是到这个字段位置所占用的byte数
SIZE后面类型的字节大小
TYPE是Class中定义的类型
DESCRIPTIONDESCRIPTION是类型的描述
VALUEVALUE是TYPE在内存中的值

GC年龄采用4位bit存储,最大为15,例如MaxTenuringThreshold参数默认值就是15

默认开启压缩说明

使用jvm 参数 -XX:+UseCompressedClassPointers压缩指针默认是开启的

假如不压缩的情况?我们手动关闭压缩指针看看?

+是开启,-就是关闭,所以指令是-XX:-UseCompressedClassPointers

也要注意,不管是否开启压缩指针,创建一个对象就是16字节的。(开启压缩指针后缺失的会由对齐填充补充)

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

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

相关文章

积跬步至千里 || 利用 os.walk 函数读取不同文件夹里的数据

利用 os.walk 函数读取不同文件夹里的数据 在很多情况下,我们需要读取某个文件夹中不同子文件夹里的各种数据文件. 此时, 我们可以利用 os.walk() 进行迭代执行. os.walk() 返回一个迭代器, 包括根目录(roots)、子目录(dirs)和文件(files)三个内容: roots 就是所有文件夹名作…

2023 最新版网络安全保姆级指南,从0到1,建议收藏!

一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;且过渡到网络安全用到编程的用到的编程的关键点不多。一般人如果想要把编程学好再开始学习网络安全往…

迪赛智慧数——柱状图(正负条形图):20212022人才求职最关注的因素

效果图从近两年职场跳槽方向看&#xff0c;相比此前人们对高薪大厂趋之若鹜&#xff0c;如今职场人更关注业务前景。根据相关数据显示&#xff0c;职场人求职最关注的因素中&#xff0c;“薪资福利”权重下降&#xff0c;“个人发展”权重上升&#xff0c;“业务前景”首次进入…

iPhone怎么找回被误删除的短信?三种方法教给你

iPhone怎么找回被误删除的短信&#xff1f;要知道&#xff0c;在苹果手机里&#xff0c;短信不像照片一样拥有“最近删除”的回收站&#xff0c;换句话说&#xff0c;删除短信后&#xff0c;你若是后悔了&#xff0c;就不能通过“最近删除”进行找回。不过别着急&#xff0c;请…

LeetCode-110. 平衡二叉树

目录题目分析递归法题外话题目来源 110. 平衡二叉树 题目分析 平很二叉树:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 二叉树节点的深度和二叉树节点的高度 递归法 递归三步曲 1.明确递归函数的参数和返回值 参数&#xff1a;当前传入节点。 返回值…

【C++设计模式】学习笔记(5):Decorator 装饰模式

目录 简介动机(Motivation)模式定义结构(Structure)要点总结笔记结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金…

2023年1月语音合成(TTS)和语音识别(ASR)论文月报

论文统计每月更新一次&#xff0c;主要跟踪语音合成和语音识别的发展状况(很多文章都是在会议后才发出&#xff0c;但不影响统计。统计过程难免存在疏漏&#xff0c;因此统计结果仅供参考。所有文章语音合成领域统计列表请访问http://yqli.tech/page/tts_paper.html&#xff0c…

肝一波,体验人工智能对话

一、肝一波&#xff0c;体验真爽 废话不多少&#xff0c;小码哥直接提大家感兴趣的问题&#xff0c;截图分享给大家。 问题一&#xff1a;如何在一年内赚到100万元 答&#xff1a; 一、赚钱的方式 开公司&#xff1a;在一年内开拓新业务模式&#xff0c;寻求投资&#xff…

Vue学习笔记3

Vue学习笔记31.1 指针1.2 指令补充&nextTick2.1 Vue-cli2.1.1 Vue-cli创建项目2.1.2 启动流程&入口文件2.1.3 eslint修复2.1.4 单文件组件-注册2.1.5 单文件组件-通信2.1.6 单文件组件-生命周期2.1.7单文件组件-指令与过滤器2.1.8 反向代理&别名反向代理需要在vue.…

二叉树进阶--二叉搜索树

目录 1.二叉搜索树 1.1 二叉搜索树概念 1.2 二叉搜索树操作 1.3 二叉搜索树的实现 1.4 二叉搜索树的应用 1.5 二叉搜索树的性能分析 2.二叉树进阶经典题&#xff1a; 1.二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;…

144. 二叉树的前序遍历

144. 二叉树的前序遍历 Java代码&#xff1a;递归 public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();preOrder(root, res);return res; } private void preOrder(TreeNode root, List<Integer> res) {i…

【沐风老师】3DMAX几何投影插件Geometry Projection使用详解

【几何投影插件】 描述 3DMAX几何投影插件Geometry Projection&#xff0c;将一个或多个对象或它的顶点选择沿全局或局部 x、y 或 z 轴投影到另一个对象上。 适用版本 3dMax2013或更高版本 安装设置 插件的安装非常简单&#xff0c;解压后把插件脚本 “geometry_projectio…

SmartSoftHelp 数据库优化辅助软件

SmartSoftHelp 数据库高并发优化&#xff0c;数据库连接字符串优化&#xff0c;SQL耗时优化&#xff0c;SQL格式化&#xff0c;美化&#xff1f; 这些问题你都知道&#xff1f; 这不仅仅是一个软件&#xff0c;而是很多种解决方案&#xff01; 支持Netframework ,netcore后台…

移动设备安全管理基础指南

什么是移动安全管理 &#xff08;MSM&#xff09; 移动安全管理是指为保护企业中的移动设备和企业数据而采取的行动。这些操作可以进一步被归类为反应性的或主动的&#xff0c;基于该操作是在数据和设备被破坏之前还是之后执行的。除了管理移动设备外&#xff0c;大多数MDM解决…

验收测试分类

α测试 Alpha 是内测版本&#xff0c;即现在所说的CB。 此版本表示该软件仅仅是一个初步完成品, 通常只在软件开发者内部交流, 也有很少一部分发布给专业测试人员。 一般而言, 该版本软件的bug 较多, 普通用户最好不要安装。 β测试 Beta是公测版本&#xff0c;是对所有用户…

【算法】高精度

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;不能只会思路&#xff0c;必须落实到代码上&#x1f43e; 文章目录前言一、高精度加法二、高精度减法三、高精度乘法四、高精度除法前言 ​ 高精度即很大很大的数&#xff0c;超过了 long long 的范围&…

html标签手册

完整的HTML页面&#x1f4d1; ①基础标签&#x1f4d1;&#x1f4d1;&#x1f4d1; HTML <!DOCTYPE> 声明 !DOCTYPE声明必须是 HTML 文档的第一行&#xff0c;位于 html标签之前。 !DOCTYPE 声明不是 HTML 标签&#xff1b;它是指示 web 浏览器关于页面使用哪个 HTML 版…

硬件设计 之 CAN通信-DSView逻辑分析仪使用-CAN波形测试

CAN总线讲解 1.基本概念&#xff1a; **CAN&#xff0c;Controller Area Network&#xff0c;控制器局域网是用于解决汽车众多控制部件之间的数据交换而开发的一种串行数据通信总线。 ** 2.CAN总线电平&#xff1a; can总线采用差分电压传输数据&#xff0c;分别是CANH和CA…

QCon演讲实录(上):多云环境下应用管理与交付实践

作者&#xff1a;阿里云大数据基础工程技术团队——郭耀星 大家上午好&#xff01;我是来自阿里云大数据基础工程技术团队的郭耀星&#xff0c;花名雪尧。今天我很高兴能够来到QCon&#xff0c;与大家分享我的经验和心得。在当前的多云环境中&#xff0c;作为运维支撑团队&…

GPDB中的HASH JOIN解析

GPDB中的HASH JOIN机制Hash Join是利用hash函数来实现和加速数据库中JOIN操作的一类算法。主要优势是hash函数可以只通过一次运算就将键值映射到固定大小的hash值&#xff0c;仅用作等值join中。由于HASH JOIN的算法复杂度在平均情况下是O(n)&#xff0c;所以通常在大规模数据时…