JVM之对象内存布局

JVM - 对象内存布局及访问 介绍JVM对象内存布局、对象创建流程及访问方式 阅读详情

前言

Object object = new Object()谈谈你对这句话的理解?一般而言在JDK8按照默认的情况下,new一个对象占多少内存空间。

  • 之前讨论过对象其位置存储在堆中(常规情况:伊甸园→S0/S1→老年代)

  • 现在讨论起布局,即对象的构成是什么?头体?

对象内存布局

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

1)对象头

对象头包含两部分数据:

  • 运行时元数 Mark Word

  • 类型指针 Class Pointer

如果对象是数组,则还需记录数组的长度。如下图所示:

运行时元数据 Mark World

  • 存储HashCode、对象年龄、锁状态标志、线程持有的锁等信息

  • 在64位系统中,Mark Word占了8个字节,类型指针占了8个字节【开启指针压缩是4字节】,一共是16(12)个字节;

  • 如果new一个对象,没有实例数据的话,就是16个字节【默认是开始指针压缩的-XX:+UseCompressedClassPointers,对齐填充4字节】

  • Mark Word的存储结构如下图所示

类型指针 Class Pointer

  • 指向方法区的类元信息(对象模板),虚拟机通过这个指针来确定对象是哪个类的实例

2)实例数据

  • 是对象真正存储的有效信息,即类中定义的各种类型属性(包括从父类继承下来的和本身定义的)。

  • 实例数据存放具有一定规则:

  1. 相同宽度的字段总是被分配在一起;

  1. 父类中定义的变量会出现在子类之前;

  1. 如果CompactFields参数为true(默认为true):子类的窄变量可能插入到父类变量的空隙

3)对齐填充

  • 虚拟机要求对象起始地址必须是8字节的整数倍【具体原因这里就不赘述了,读者可自行查阅相关资料】。

  • 填充数据不是必须存在的,仅仅是为了字节对齐这部分内存按8字节补充对齐

4)JOL验证

引入JOL依赖

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

使用JOL查看Object对象内部细节

使用JOL查看Customer对象内部细节

publicclassCustomer{
    int id;
    boolean flag = false;
    publicstaticvoidmain(String[] args){
        System.out.println(ClassLayout.parseInstance(new Customer()).toPrintable());
    }
}
  • 7→填充的字节数

  • 声明一个Customer的实例,只有一个对象头的实例对象,12字节(开启压缩指针)+ 4字节[int] + 1字节[boolean]=17字节,此时需要对齐填充到24字节

默认开启指针压缩的 -XX:+UseCompressedClassPointers

  • 12 + 4(对齐填充) == 一个对象16字节(不算实例数据)

手动关闭指针压缩 -XX:-UseCompressedClassPointers

  • 8 + 8 == 16字节(不算实例数据)

图示对象的内存布局

对象的访问定位

创建对象是为了后续使用该对象,那么JVM是如何通过栈帧中的对象引用访问到其内部的对象实例的呢?

  • 通过栈上的reference访问

而reference类型只是一个指向对象的引用,并没有定义这个引用应该通过什么方式去定位、访问到堆中对象的具体位置,而JVM中主流的对象访问方式主要有使用句柄和直接指针两种方式。

1)句柄访问

Java堆中可能会划分出一块内存来作为句柄池,而reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地址信息。

  • 优点:reference中存储稳定句柄地址,对象被移动(垃圾收集时候移动对象很普遍)时会改变句柄中的实例数据指针即可,reference本身不需要被修改

  • 缺点:需要多占用一些空间

2)直接指针

  • HotSpot使用该方式。

使用直接指针访问的话,Java堆中对象的内存布局就必须考虑如何放置访问类型数据的相关信息,reference中存储的直接就是对象地址,如果只是访问对象本身的话,就不需要多一次间接访问的开销。

[Java JVM] Hotspot GC研究- 开篇&对象内存布局 Hotspot简介Hotspot是openjdk的JVM虚拟机, linux发行版下默认安装的是openjdk, 而oracle 的jdk也基本是由openjdk代码编译而来, 外加上一些商业代码, 形成orcale的jdk. 由此可见, hotspot的无处不在. 现在越来越多的应用构建在java之上, 大数据的很多项目, 如Hbase, Hive, flume等等, 都可运行在hotspot之上 阅读详情

相关推荐

JVM 中对象的内存布局以及如何计算对象和数组的大小

继续上一文章的 我们来谈谈minor gc 与full gc 文章目录Minor gc Minor gc

511

对象的内存布局

《深入理解Java虚拟机是这样定义的》:在HotSpot虚拟机里, 对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。HotSpot虚拟机对象的对象头部分包括两类信息。第一类是用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32个比特和64个比特, 官方称它为“Mark Word

白夜ovo的博客 1663

华大HC32F460 ADC+DMA高效数据采集实战解析

本文深入解析了华大HC32F460微控制器中ADC与DMA协同工作的高效数据采集方案。通过实战代码演示,详细阐述了如何配置硬件触发、序列扫描及AOS事件联动,实现后台自动采集,从而解放CPU资源,提升系统实时性与可靠性,适用于传感器数据采集、音频处理等多种场景。

weixin_29189373的博客 177

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

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

LoveSummer 5万+

群晖NAS搭建Git Server避坑指南:从SSH配置到权限管理的完整流程

本文提供了一份详尽的群晖NAS搭建Git Server实战指南。文章从启用并安全配置SSH服务入手,深入解析了用户权限体系设计、SSH连接与仓库初始化、客户端SSH密钥配置等核心步骤,并提供了常见错误排查与生产环境加固方案,帮助开发者成功构建私有、安全的代码托管平台。

rock5的博客 420

Solidworks钣金设计:折弯系数、K因子与折弯扣除的实战应用解析

本文深入解析Solidworks钣金设计中折弯系数、K因子与折弯扣除的核心概念与实战应用。通过厘清三者间的逻辑关系与换算方法,并结合材料特性、工艺参数及车间实测,指导工程师精准确定展开长度,确保设计图纸与加工实物的一致性,有效提升钣金件设计精度与生产效率。

weixin_29268267的博客 925

java usecompressedclasspointers_聊聊jvm的CompressedClassSpace

序本文主要研究一下jvm的CompressedClassSpaceCompressedClassSpacejava8移除了permanent generation,然后class metadata存储在native memory中,其大小默认是不受限的,可以通过-XX:MaxMetaspaceSize来限制如果开启了-XX:+UseCompressedOops及-XX:+UseCompressed...

weixin_42588672的博客 753

Unity 第一人称视角控制移动、旋转

第一人称视角操作此功能主要是借鉴YouTube,写的蛮好我就搬运过来让大家也试试。

qq_36515472的博客 4202

JVM之内存布局与对象大小

本文章来源于:https://github.com/Zeb-D/my-review ,请star 强力支持,你的支持,就是我的动力。 Java对象内存布局 [TOC] 在Java中基本数据类型的大小, 例如int类型占4个字节、long类型占8个字节,那么Integer对象和Long对象会占用多少内存呢? 本文结合JVM相关的书籍以及网上的大神, 从基本数据类型到对应的包装类型、再到引用类型,也...

在此立一个IT职业上的flag:https://github.com/Zeb-D/my-review 1万+

[终于解决]Ubuntu14.04 32位安装移动网卡(0bda:b711)驱动8188gu tplink-WN726n

大致梳理一下问题解决的流程 首先,在台式机做了双系统,台式机只有一个网线接口,由于项目要求,需要占用网口传输数据,所以用之前买的tplink-WN726n免驱版2.0的移动网卡 【note】免驱版只能在Windows下安装使用,在Ubuntu系统中无法使用,所以,需要另辟蹊径。 找了很多资料,尝试很多方法,有的复杂有的简单,终于解决。 【思路】首先在Ubuntu系统中输入lsusb,查看是否检测到USB网卡设备。然后从Github中复制代码,构建,安装,然后modprobe一下,到前面那步还不行,就再来一步

瑞o 1万+

蓝牙学习笔记之SMP协议(十四)

目录 写在前面 SM规范简述 安全管理器 加密工具 配对流程 安全属性 IO功能 加密密钥大小 配对算法 低功耗蓝牙安全 密钥和值的定义 分发密钥的生成 密钥分配 安全管理器会话协议 介绍 ​​​​​​​命令格式 写在前面 安全规范协议,主要是描述LE控制器设备配对、认证、加密等过程进行规定,同时也对相关算法进行了说明。 低功耗蓝牙的安全管理经历了几个阶段,L...

在云巅的博客 3663

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

这次说的是64bit的jvm,暂不谈32bit的jvm,两者的对象大小是不一样的。 java对象的存储布局分为两种情况:普通对象 和 数据。 先说普通对象吧:如下图 那为啥对齐单元的大小是8个字节呢? 因为是64bit位的jvm,8个字节刚好是64个比特位,这样读取的效率高。 那这个东西我们在代码里面看得到吗? 可以看到的。 我们在pom.xml里面引入依赖: <dependency> <groupId>org.openjdk.jol...

wy_05689的博客 1571

大模型之Spring AI实战系列(二十一):Spring AI + MCP + 本地文件系统实战指南

在上一篇文章中,我们学习了如何使用 Spring AI 集成 Model Context Protocol (MCP),并通过 Brave Search 实现了互联网搜索能力的接入。本文将继续深入 Spring AI 的 MCP 实战能力,介绍如何将 **本地文件系统** 封装为 LLM 可调用的工具

寻道AI,探索AI无限可能! 2524

JVM 之 Java 对象内存布局

JVM对象内存布局篇

qq_74212030的博客 977

【AI大模型:前沿】44、大模型+机器人:从自动化工具到通用智能体的技术革命与应用全景

大模型与机器人的融合催生了“具身智能体”,突破传统机器人智能化缺失、功能单一等瓶颈。大模型赋予机器人三大能力:常识推理(如热牛奶需去包装)、模糊指令解析(如“整理书桌”拆解步骤)、零样本任务泛化(如搭乐高桥)。技术实现上,通过多模态融合(视觉-语言-动作)、仿真训练(虚拟试错)和实时反馈(动态调整动作)形成闭环。主流框架如Google RT-2(端到端动作生成)、斯坦福Q-Transformer(强化学习优化)和Figure 01(ChatGPT驱动人形机器人)各具优势,可适配工业、家庭等场景。该技术正重塑

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2021

假人有限元模型

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

JVM之对象的内存布局

JVM之对象的内存布局 先来看一道大厂的面试题 一、对象的创建过程 二、对象在内存中的存储布局 2.1、对象头 对象头用于存储对象的元数据信息 对象头又可以分为两块内容:第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机中分别位32bit和64bit,官方称它为 Mark Word。对象头的另一部分是类型指针,指向它的类元数据的指针,用于判断对象属于哪个类的实例,另外,如果对像

子冉冰清的博客 798

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【jvm】对象的内存布局

1.并不是每个对象都有这部分,但JVM可能会在对象的末尾添加一些填充字节(Padding Bytes),以确保对象的大小是某个字节的倍数(通常是8字节)。2.对象的内存布局在JVM内部进行优化,以提高性能。1.对象的实际内存布局和大小可能受到JVM实现、JVM参数(如是否启用压缩指针)、操作系统、硬件架构等多种因素的影响。3.使用JVM提供的工具(如jmap、jhat、VisualVM等)可以帮助分析对象的内存使用情况。1.存储对象的字段(Field)信息,包括从父类继承的字段和自己定义的字段。

王佑辉的博客 730

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JVM-对象内存布局篇(4)

菜鸟程序员的学习笔记,各位大佬请指教。

weixin_47316458的博客 1936

从JVM角度看对象创建过程和内存布局

从JVM角度看对象创建过程和内存布局

欢迎每一位朋友不吝赐教,无论是宝贵的建议还是中肯的批评,都将是我前进路上不可或缺的灯塔 1557

JVM之对象创建流程及对象内存布局

JVM之内存区域及对象创建流程对象创建流程分配内存并发解决方法设置初始值在程序中可能会出现的问题设置对象头对象头数据结构Class文件的<.init>对象的内存布局 对象创建流程 当JAVA虚拟机碰到new字节码指令时,首先会去常量池中查找是否有对应的类名(也就是去查找是否有对应的符号引用),然后去检查这个符号引用代表的类是否已经被加载,解析和初始化过。如果没有会先进行刚才说的类加载过程。 当类加载后,虚拟机将会为其分配内存,为其分配的内存大小是可知的,下面的内存布局将会讲解为什么是可知的。 分

北洋的博客 1815

【Java JVM】实例对象内存布局

当 Java 应用启动后, 基本就是在不断的创建对象, 回收对象的过程中。而这些创建的对象基本都是存放在应用的堆 (heap) 中, 但是这些对象在堆中又是什么样子的呢?在这篇文章中, 我们分析一下 Java JVM 中实例对象的内存布局。在 HotSpot 虚拟机里, 对象在堆内存中的存储布局可以划分为三个部分: 对象头 (Object Header), 实例数据 (Instance Data) 和对齐填充 (Padding)。

LCN29的博客 1291

【JVM】总结篇之对象内存布局 执行引擎

TLAB 把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲区,(TLAB ,Thread Local Allocation Buffer)虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定。将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。对象创建方法,对象的内存分配。

ChanceZhou的博客 834

深入理解JVM对象内存布局:从创建到内存分配

Java对象在JVM中的内存布局包含三部分:对象头(存储Mark Word、类型指针等元数据)、实例数据(对象字段内容)和对齐填充(保证8字节对齐)。对象头占据固定开销,实例数据会根据字段类型和排列影响内存占用,而填充字节确保内存对齐提升性能。理解这一结构有助于优化内存使用、诊断性能问题,特别是在处理大量小对象时需注意相对开销。工具如JOL可帮助精确分析对象内存占用。

weixin_51786043的博客 1478

7.jvm对象内存布局

jvm 对象内存布局详解

流月up的博客 485

Jvm中的对象内存布局

Jvm内存布局

Beyourselfsun的博客 563

【jvm系列-06】深入理解对象的实例化、内存布局和访问定位

深入理解对象的实例化,内存布局和访问定位

zhenghuishengq的博客 8726
上一篇: java技术提升宝典,备战金三银四
下一篇: Spring boot会了吗?Spring boot实战文档赶紧学习起来
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值