Java对象内存结构详解

Java对象内存结构详解

Java对象在JVM内存中的存储结构可以分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。以下是64位JVM(开启压缩指针)下的典型布局:
在这里插入图片描述

1. 对象头(Header)

对象头包含运行时元数据和控制信息,占12字节(压缩指针)或16字节(未压缩)

(1) Mark Word(8字节)

存储对象自身的运行时数据,内容会随锁状态变化:

锁状态存储内容
无锁哈希码(31bit) + 分代年龄(4bit) + 偏向模式(1bit) + 锁标志(2bit)
偏向锁线程ID(54bit) + Epoch(2bit) + 分代年龄(4bit) + 偏向模式(1bit) + 锁标志(2bit)
轻量级锁指向栈中锁记录的指针(62bit) + 锁标志(2bit)
重量级锁指向监视器(Monitor)的指针(62bit) + 锁标志(2bit)
GC标记空(用于垃圾回收标记)

(2) Klass Pointer(4字节)

指向方法区中的类元数据的指针(开启压缩指针时为4字节,否则8字节)

(3) 数组长度(可选,4字节)

如果是数组对象,额外存储数组长度

2. 实例数据(Instance Data)

存储对象真正的有效信息,即各个字段的内容,排列顺序受以下规则影响:

  1. 基本类型优先(long/double → int/float → short/char → byte/boolean)
  2. 相同宽度字段放在一起
  3. 父类字段在子类之前

字段内存占用

类型大小
boolean1字节
byte1字节
short2字节
char2字节
int4字节
float4字节
long8字节
double8字节
引用类型4字节(压缩指针)或8字节

示例:

class MyObject {byte b;      // 1字节int i;       // 4字节long l;      // 8字节Object ref;  // 4字节(压缩指针)
}
// 实例数据总大小 = 1 + 4 + 8 + 4 = 17字节

3. 对齐填充(Padding)

JVM要求对象起始地址必须是8字节的整数倍,因此可能需要填充字节(0-7字节)

示例计算

对象头:12字节 (MarkWord 8 + KlassPointer 4)
实例数据:17字节
总计:12 + 17 = 29字节
需要填充到32字节(8的倍数)
最终对象大小:32字节

4. 完整对象内存布局示例

[对象头][Mark Word(8字节)] 0x00000001d83eb950[Klass Pointer(4字节)] 0x0000000100000000[数组长度(4字节)] 0x00000005 (仅数组对象有)
[实例数据][int id(4字节)] 0x00000001[String name(4字节)] 0x000000076bdc8c18[double price(8字节)] 0x4024000000000000
[对齐填充(4字节)] 0x00000000

5. 查看对象内存布局的方法

(1) 使用JOL工具

// 添加依赖
<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.16</version>
</dependency>// 打印对象布局
System.out.println(ClassLayout.parseInstance(obj).toPrintable());

(2) 示例输出

class com.example.MyObject object internals:
OFF  SZ               TYPE DESCRIPTION               VALUE0   8                    (object header: mark)     0x00000001d83eb9508   4                    (object header: class)    0x000000010000000012   4                int MyObject.id               116   8             double MyObject.price            10.024   4   java.lang.String MyObject.name             "test"28   4                    (object alignment gap)    
Instance size: 32 bytes

6. 对象结构优化技巧

  1. 字段重排序:手动排列字段可减少填充

    // 优化前:需要4字节填充
    class Bad {byte b;long l;int i;
    }
    // 优化后:无填充
    class Good {long l;int i;byte b;
    }
    
  2. 使用基本类型:避免包装类(Integer等)的内存开销

  3. 对象共享:对于不变对象可复用(如String池)

资料免费获取

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

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

相关文章

【TI MSPM0】Printf重定向学习

一、新建工程 通过XDS110与电脑进行通信。 选择这两个引脚 需要添加这两个头文件 在程序中添加这三个函数即可对printf进行重定向 二、封装函数 另一种方法 封装一个函数&#xff0c;定义一个数组

深度强化学习基础 0:通用学习方法

过去自己学习深度强化学习的痛点&#xff1a; 只能看到各种术语、数学公式勉强看懂&#xff0c;没有建立清晰且准确关联 多变量交互关系浮于表面&#xff0c;有时候连环境、代理控制的变量都混淆 模型种类繁多&#xff0c;概念繁杂难整合、对比或复用&#xff0c;无框架分析所…

asm汇编源代码之-字库转换程序

将标准的16x16点阵汉字库(下载16x16汉字库)转换成适合VGA文本模式下显示的点阵汉字库 本程序需要调用file.asm中的子程序,所以连接时需要把file连接进来,如下 C:\> tlink chghzk file 调用参数描述如下 C:\> chghzk ; 无调用参数,转换标准库文件(SRC16.FNT)为适合VGA…

uniapp转换markdown

效果 AI智能体 微信小程序 流式 1.安装Node.js 参考:2024最新版Node.js下载安装及环境配置教程&#xff08;非常详细&#xff09;_node.js 安装-CSDN博客 2.需要克隆项目到本地或直接到项目地址下载压缩包。 参考&#xff1a;uniapp中解析markdown支持网页和小程序_uniapp ma…

用java代码如何存取数据库的blob字段

一.业务 在业务中我们被要求将文件或图片等转成 byte[] 或 InputStream存到数据库的Blob类型的字段中. 二.Blob类型介绍 在 MySQL 中&#xff0c;Blob 数据类型用于存储二进制数据。MySQL 提供了四种不同的 Blob 类型&#xff1a; TINYBLOB: 最大存储长度为 255 个字节。BL…

qemu(2) -- 定制开发板

1. 前言 qemu支持自定义开发板&#xff0c;本文就记录一下折腾的过程。基于qemu-10.0.0-rc3添加x210vb3s开发板。 2. 添加板卡文件 网上参考了一些文章&#xff0c;有些文章使用的版本和我的不一样&#xff0c;折腾起来费了点时间&#xff0c;最后发现还是直接参考qemu中已有…

Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM)

Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数&#xff08;决策树、逻辑回归、KNN、SVM&#xff09; 问题模板解题思路1. 导入必要的库2. 加载数据3. 划分训练集和测试集4. 数据预处理5. 定义算法及其参数6. 存储算法和对应指标7. 训练模型并计算指标8. 找…

CPU(中央处理器)

一、CPU的定义与核心作用 CPU 是计算机的核心部件&#xff0c;负责 解释并执行指令、协调各硬件资源 以及 完成数据处理&#xff0c;其性能直接影响计算机的整体效率。 核心功能&#xff1a; 从内存中读取指令并译码。执行算术逻辑运算。控制数据在寄存器、内存和I/O设备间的…

上层 Makefile 控制下层 Makefile 的方法

在复杂的项目中&#xff0c;通常会将项目划分为多个模块或子项目&#xff0c;每个模块都有自己的 Makefile。上层 Makefile 的作用是协调和控制这些下层 Makefile 的构建过程。下面是几种常见的示例&#xff0c;实现上层 Makefile 对下层 Makefile 的控制。 直接调用&#xff1…

prompts提示词经典模板

prompts.py 中的提示词模板详解 文件中定义了两个核心提示词模板&#xff1a;REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。这两个模板在 DeepResearcher 的推理过程中扮演着关键角色。下面我将详细解析这两个模板的结构和功能。 REASON_PROMPT 详解 REASON_PROMPT 是用于指…

使用python获取电脑硬盘信息

import psutil# 获取硬盘信息 disk_partitions psutil.disk_partitions() print(disk_partitions) for partition in disk_partitions:print(f"设备: {partition.device}")print(f"挂载点: {partition.mountpoint}")print(f"文件系统类型: {partitio…

HarmonyOS-ArkUI V2装饰器: @Provider和@Consumer装饰器:跨组件层级双向同步

作用 我们在之前学习的那些控件中,各有特点,也各有缺陷,至今没有痛痛快快的出现过真正能跨组件的双向绑定的装饰器。 比如 @Local装饰器,不能跨组件@Param装饰器呢,能跨组件传递,但是仅仅就是下一层组件接收参数。另外,它是单向传递,不可被重新赋值。如果您非要改值则…

索引下推(Index Condition Pushdown, ICP)

概念 索引下推是一种数据库查询优化技术&#xff0c;通过在存储引擎层面应用部分WHERE条件来减少不必要的数据读取。它特别适用于复合索引的情况&#xff0c;因为它可以在索引扫描阶段就排除不符合全部条件的数据行&#xff0c;而不是将所有可能匹配的记录加载到服务器层再进行…

idea在线离线安装插件教程

概述 对于小白来说&#xff0c;刚使用idea时&#xff0c;还有很多不懂的地方&#xff0c;这里&#xff0c;简单介绍下如何安装插件。让小白能容易上手全盘idea。 1、File -> Settings 2、找到 Plugins -> Marketplace 3、安装 3.1、在线安装 输入想搜索的内容&#x…

豪越赋能消防安全管控,解锁一体化内管“安全密码”

在消防安全保障体系中&#xff0c;内部管理的高效运作是迅速、有效应对火灾及各类灾害事故的重要基础。豪越科技凭借在消防领域的深耕细作与持续创新&#xff0c;深入剖析消防体系内部管理的痛点&#xff0c;以自主研发的消防一体化安全管控平台&#xff0c;为行业发展提供了创…

ES6学习03-字符串扩展(unicode、for...of、字符串模板)和新方法()

一、字符串扩展 1. eg: 2.for...of eg: 3. eg: 二。字符串新增方法 1. 2. 3. 4. 5.

探索Streamlit在测试领域的高效应用:文档读取与大模型用例生成的完美前奏

大模型用例生成前置工作之文档读取——构建你的自动化测试基础 在群友的极力推荐下&#xff0c;开始了streamlit的学习之旅。本文将介绍如何使用Streamlit开发一个多功能文档处理工具&#xff0c;支持读取、预览、格式转换和导出多种测试相关文档&#xff08;YAML、JSON、DOCX…

flutter 桌面应用之窗口自定义

在开发桌面软件的时候我们经常需要配置软件的窗口的大小以及位置 我们有两个框架选择:window_manager和bitsdojo_window 对比bitsdojo_window 特性bitsdojo_windowwindow_manager自定义标题栏✅ 支持❌ 不支持控制窗口行为&#xff08;大小/位置&#xff09;✅&#xff08;基本…

Cyber Weekly #51

赛博新闻 1、英伟达开源新模型&#xff0c;性能直逼DeepSeek-R1 本周&#xff0c;英伟达开源了基于Meta早期Llama-3.1-405B-Instruct模型开发的Llama-3.1-Nemotron-Ultra-253B-v1大语言模型&#xff0c;该模型拥有2530亿参数&#xff0c;在多项基准测试中展现出与6710亿参数的…

【JS】关于原型/原型链

本文会讲解什么是原型&#xff0c;什么是原型链&#xff0c;以及查找原型的方法&#xff0c;最后会实现一个函数&#xff1a;判断某对象是否有某属性。 定义 原型&#xff1a;函数都有prototype属性&#xff0c;称作原型/原型对象 原型可以放一些方法和属性&#xff0c;共享…