Java对象在内存的结构

Java之JVM内存结构、Java内存模型、Java对象模型 为什么80%的码农都做不了架构师?>>> ... 阅读详情

一、内存布局

对象在内存中存储的结构由三部分组成:对象头、实例数据、对齐填充。

  1. 对象头

MarkWord(标记字段) :哈希码、分代年龄、锁标志位、偏向线程ID、偏向时间戳等信息。Mark Word被设计成了一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。例外:如果是数组的话,还需要有一块区域存放数组大小,因为没办法从元数据确认数组大小,所以要存储到对象头的MarkWord中。

MarkWord是根据对象的状态区分不同的状态位,从而区分不同的存储结构。例如下图:

对象头的另一部分是类型指针(Klass Pointer)。

Klass Pointer(类型指针): 即指向当前对象的类的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说查找对象的元数据信息并不一定要经过对象本身。

另外,如果是数组,对象头中还有一块用于存放数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中无法确定数组的大小。 其中偏向锁和轻量级锁是java6以后对synchronized进行优化后新增的,稍后做介绍。

  1. 实例数据

实例数据部分是对象真正存储的有效信息,也就是我们在程序代码里面所定义的各种类型的字段内容,无论是从父类继承下来的,还是在子类中定义的都需要记录下来。 这部分的存储顺序会受到虚拟机分配策略参数(FieldsAllocationStyle)和字段在Java源码中定义顺序的影响。

HotSpot虚拟机 默认的分配策略为longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers),从分配策略中可以看出,相同宽度的字段总是被分配到一起。在满足这个前提条件的情况下,在父类中定义的变量会出现在子类之前。如果 CompactFields参数值为true(默认为true),那子类之中较窄的变量也可能会插入到父类变量的空隙之中。

  1. 对齐填充

第三部分对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说就是对象的大小必须是8字节的整数倍。对象头正好是8字节的倍数(1倍或者2倍),因此当对象实例数据部分没有对齐的话,就需要通过对齐填充来补全。

二、创建过程

在语言层面上,创建对象通常 (例外:克隆、反序列化) 仅仅是一个 new关键字而已,而在虚拟机中,对象(限于普通Java对象,不包括数组和Class对象等)的创建又是怎样的?

以下分析虚拟机遇到new指令时的操作:

一个对象的存储涉及内存的三部分:方法栈(存储指针)、方法区(存储类信息、常量、静态变量)、堆(存储对象的实例数据)。其中关于最左侧图中“对象的引用”有两种实现方式,如下右图(两种:1、通过句柄实现;2、直接指针实现;):

三、举例

在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍?

int占用的是4字节。由以上分析可得Integer的结构如下:

Integer只有一个int类型的成员变量value,所以其对象实际数据部分的大小是4个字节,然后再在后面填充4个字节达到8字节的对齐,所以可以得出Integer对象的大小是16个字节。

因此,我们可以得出Integer对象的大小是原生的int类型的4倍。

关于对象的内存结构,需要注意数组的内存结构和普通对象的内存结构稍微不同,因为数据有一个长度length字段,所以在对象头后面还多了一个int类型的length字段,占4个字节,接下来才是数组中的数据,如下:

IEC61850建模实战:从标准解读到ICD文件生成 本文详细介绍了IEC61850建模的实战过程,从标准解读到ICD文件生成,涵盖了变电站自动化系统的结构化数据模型设计。通过分层结构、标准服务映射和XML文件解析,帮助读者掌握电力系统智能电子设备的标准化建模方法,提升工程实施效率。 阅读详情

相关推荐

绿联UGOS Pro系统虚拟机部署Windows 11详细教程(跳账户登录,安装内存驱动)

总的来说,此次的虚拟机部署Windows 11出现的问题应该是目前几乎所有虚拟机都可能出现的问题,和绿联是没有关系的。所以说如果你在其它NAS上虚拟机部署Windows 11系统如果出现同样的问题,那么今天教程的方案也同样适用于你。

qq_63499861的博客 1万+

【转载】Java对象在内存的结构

Java对象在内存的结构

weixin_41432808的博客 1084

PSINS工具箱15状态组合导航仿真程序(test_SINS_GPS_153)浅析-卡尔曼滤波设置+导航解算

文章目录test_SINS_GPS_153源码poserrsetkfinitgabiaskfupdate流程 test_SINS_GPS_153源码 poserrset function poserr = poserrset(dpos0, dlon, dhgt) % position errors dpos=[dlat;dlon;dhgt] setting. % % Prototype: poserr = poserrset(dpos0) % Input: dpos0=[dlat; dlon; dhgt],

十八与她的博客 2161

【jvm】一文带你搞懂java对象在内存中具体的结构(八股必背)

当一个 Java 对象被创建时,它会被。java对象在内存中的结构可以分为三个重要的部分——对象头(Header)、实例数据(Instance Data)、对其填充(Padding)对象头主要是由两部分或三部分组成,、类指针数组(三部分):MarkWord、类指针、数组长度。

miles067的博客 1604

基于springboot生鲜食品订购系统的设计与实现

近年来互联网络的迅猛发展和电子终端设备的普及,赋予了各行业充足的发展空间。微信小程序的O2O生鲜食品订购相比于传统信息技术,时效性是它最大的特色,已经在电子娱乐、经济等中发挥着举足轻重的作用。短时间内迅速扩大了线上管理系统的规模。尽管O2O生鲜食品订购已经有了很大程度的发展,但在微信小程序的O2O生鲜食品订购领域上却少有建设。

1024

PLC控制气缸与电磁阀:从原理到实战编程详解

在工业自动化领域,很多工程师都能编写PLC程序控制电机启停,但当涉及到气缸和电磁阀的精确控制时,却常常遇到动作不协调、响应延迟甚至设备损坏的问题。这背后的关键不在于PLC编程本身,而在于对气动元件特性和控制逻辑的深入理解。 本文将从实际工程问题出发,深入解析气缸与电磁阀的工作原理、PLC控制逻辑设计、常见故障排查方法,并通过完整的梯形图实例,帮助读者掌握气动系统自动化编程的核心要点。无论你是刚接触PLC的初学者,还是希望提升气动控制技能的工程师,都能从中获得实用的技术指导。 1. 气缸与电磁阀在自动化控制中

weixin_42522374的博客 340

java对象在内存中的结构(HotSpot虚拟机)

一、对象的内存布局 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 从上面的这张图里面可以看出,对象在内存中的结构主要包含以下几个部分: Mark Word(标记字段):对象的Mark Word部分占4个字节,其内容是一系列的标记位,比如轻量级锁的标记位,偏向锁标记位等等。 Klass Pointer(Class对象指针):Class对象指针的大小也是4个字节,其指向的位置是对象对应的Class

yygr的博客 1278

保姆级教程:在mmdetection中手动计算并可视化P、R、F1值(附完整代码)

本文提供了一份详细的mmdetection教程,指导开发者如何手动计算并可视化精确率(P)、召回率(R)和F1值。通过完整的代码示例和清晰的步骤说明,帮助用户深入理解目标检测模型的性能评估方法,特别适合需要精细分析模型表现的计算机视觉研究人员和工程师。

weixin_29038303的博客 401

Java对象的内存结构

Java 对象的内存结构对于理解 Java 内存管理和性能优化至关重要。本文将详细介绍 Java 对象的内部结构,并提供查看这些信息的方法。对象头 (Header)实例数据 (Instance Data)填充数据 (Padding Data)

斌斌(Java) 1757

如何更好的理解PFC(功率因数校正)

此电路虽然简单,可以在前期设计的无PFC功能的设备上,简单的增加一个合适的电感(适当的选取L和C的值),从而达到具有PFC的作用,但是这种简单的、低成本的无源PFC输出纹波较大,滤波电容两端的直流电压也较低,电流畸变的校正及功率因数补偿的能力都很差,而且L的绕制及铁芯的质量控制不好,会对图像及伴音产生严重的干扰,只能是对于前期无PFC设备使之能进入市场的临时措施。)在t4~t5期间尽管二极管左边电压在逐步上升,但是由于二极管右边的Uc放电缓慢右边的电压Uc仍旧大于左边,二极管仍旧反偏截止。

U_YAO的博客 950

【行为决策模块项目实战】解耦控制--多控制器管理与切换的方法(附C++代码)

[请添加图片描述](https://img-blog.csdnimg.cn/c11300d9e4fe421e9070f474a468d1db.jpeg)本文先对多控制器管理与切换的方法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容VERTICAL_VEL, //垂直速度PID控制器VERTICAL_POS, //垂直位置PID控制器HORIZONTAL, //水平速度PID控制器YAW, //航向角yaw位置逻辑控制器。

qq_35635374的博客 1211

java对象的内存布局

对象的内存布局分为两种,普通对象和数组对象。

童小绿 学无止境 1346

学Simulink——基于风力发电系统的建模与仿真场景:基于自适应控制的风力发电系统输出功率调节

本文详细介绍了使用Simulink搭建风力发电系统自适应控制模型的完整流程。首先阐述了风速波动对电网的影响及自适应控制的优势,然后逐步指导创建Simulink项目、搭建系统结构(包括风速源、风轮机、发电机等模块),重点讲解了模型参考自适应控制器(MRAC)的设计步骤和参数设置方法。通过仿真分析验证了系统在风速变化时仍能保持输出功率稳定,展示了自适应控制的响应速度和鲁棒性。最后提出了引入深度学习预测、多变量控制等优化方向,为新能源领域工程师提供了实用的建模与仿真指导。

amy_mhd的博客 220

Java对象内存结构详解

JVM要求对象起始地址必须是8字节的整数倍,因此可能需要填充字节(0-7字节)对象头包含运行时元数据和控制信息,占12字节(压缩指针)或16字节(未压缩)指向方法区中的类元数据的指针(开启压缩指针时为4字节,否则8字节):避免包装类(Integer等)的内存开销。:对于不变对象可复用(如String池)如果是数组对象,额外存储数组长度。:手动排列字段可减少填充。下方公众号资料免费获取。

未来会更好的博客 1035

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java对象的内存结构

java对象的内存结构 对象结构 如上图,java对象内存构成分成三部分,对象头、对象体、字节对齐。其中对象头包括:mark word(标记字)、class pointer(类对象指针)、array length(数组长度) 对象头 mark word 用来存储自身运行时的数据,例如:对象的分代年龄、hashCode、锁状态等信息 Class Pointer(类对象指针) 用来存储方法区中字节码对象的地址,JVM通过这个指针来确定这个对象是属于那个类的实例。 Array Length(数组长度

qq_42777071的博客 1327

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java对象的内存结构_Java对象占用内存大小--Java对象的内存结构分析

Java对象占用内存大小--Java对象的内存结构分析前言本文主要介绍Java对象的内存结构。Java对象的内存结构Java对象的内存结构包括:对象头实例数据对齐填充普通对象和数组对象,在内存结构上有一些不同,主要体现在对象头中。普通对象的对象头由Mark Word和Klass Pointer组成,而数组对象,对象头还包括一个数组长度。具体结构如下图:对象头普通对象:Mark Word:包含Has...

weixin_34142444的博客 266

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java 对象内存结构_Java对象在内存的结构

一、内存布局对象在内存中存储的结构由三部分组成:对象头、实例数据、对齐填充。对象头MarkWord(标记字段):哈希码、分代年龄、锁标志位、偏向线程ID、偏向时间戳等信息。Mark Word被设计成了一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。例外:如果是数组的话,还需要有一块区域存放数组大小,因为没办法从元数据确认数组大小,所以要存储到对象头的M...

weixin_35875219的博客 287

java对象在内存中结构_Java对象在内存的结构

一、内存布局对象在内存中存储的结构由三部分组成:对象头、实例数据、对齐填充。 对象头MarkWord(标记字段):哈希码、分代年龄、锁标志位、偏向线程ID、偏向时间戳等信息。Mark Word被设计成了一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。例外:如果是数组的话,还需要有一块区域存放数组大小,因为没办法从元数据确认数组大小,所以要存储到对象头的...

weixin_42106765的博客 218

java对象的内存结构_Java对象在内存的结构

一、内存布局对象在内存中存储的结构由三部分组成:对象头、实例数据、对齐填充。对象头MarkWord(标记字段):哈希码、分代年龄、锁标志位、偏向线程ID、偏向时间戳等信息。Mark Word被设计成了一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。例外:如果是数组的话,还需要有一块区域存放数组大小,因为没办法从元数据确认数组大小,所以要存储到对象头的M...

weixin_39601642的博客 113

JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。 可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构、Java内存模型和Java对象模型这三者的概念及其间的区别。甚至我见过有些面试官自...

好学若饥,谦卑若愚 1125

Java内存结构、内存模型以及对象模型

1. Java内存结构(6) Java内存结构即运行时数据区域,Java虚拟机在执行Java程序的过程中,会把它管理的内存划分为几个不同的数据区域,这些区域都有各自的用途、创建时间、销毁时间 1.1 PC寄存器/程序计数器 程序计数器用于保存当前正在执行的程序的内存地址,以便线程的中断和恢复,每个线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储 1.2 栈 每当创建一个线程,...

北京-大白的博客 849

Java内存结构,Java对象内存布局

Java内存结构,虚拟机栈(线程栈),方法区,程序计数器,本地方法栈,Class指针压缩区,JIT热点代码缓存区,java对象内存布局 - JOL(Java Object Layout),对象头,压缩指针,对象对齐,对象内字段对齐............

m0_66668867的博客 349

科普文:Java对象内存结构详解

Java对象内存结构解析:32位与64位JDK对比分析 摘要: Java对象内存布局主要包含对象头(MarkWord和类型指针)、实例数据和对齐填充三部分。32位JDK对象头为8字节,64位JDK默认16字节(启用压缩指针后12字节)。64位系统下引用类型默认8字节,启用压缩指针后降至4字节。空对象在32位和64位(压缩)JDK中均占16字节,但64位未压缩时达32字节。Class类对象因元数据复杂,内存占用明显大于普通对象。性能方面,64位系统提供更大寻址空间,推荐启用压缩指针(堆内存<32GB时)

为无为,事无事,味无味。 1127

java学习笔记,面向对象和对象的内存结构

一、概述 面向对象是基于面向过程的编程思想。 二、特点 是一种更符合我们思想习惯的思想 可以将复杂的事情简单化 将我们从执行者变成了指挥者 三、特征 封装 继承 多态 四、类与对象 类:是一组相关的属性和行为的集合 对象:是该类事物的具体体现 五、使用对象 例如:类名 对象名 = new 类名(); 六、案例 //把大象装进冰箱 class Daxiang{ //创建大象类 ...

Lemon 419
上一篇: Java并发 -- 线程生命周期
下一篇: Java和操作系统交互细节
Java_No2
博客等级 码龄7年 20粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值