JVM--基础--21--对象的内存布局

2023-11-13

JVM–基础–21–对象的内存布局




1、普通对象实例与数组对象实例的数据结构图

2、在HotSpot虚拟机中,对象在内存中存储的布局如下

2.1、对象头(Header)

2.1.1、markword

  1. 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等
  2. 这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit。

2.1.2、klass

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

2.1.3、数组长度(只有数组对象有)

如果对象是一个数组,那在对象头中还必须有一块数据用于记录数组长度。因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中无法确定数组的大小。

2.2、实例数据(Instance Data)

  1. 是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。
  2. 无论是从父类继承下来的,还是在子类中定义的,都需要记录起来。
  3. 这部分的存储顺序会受到虚拟机分配策略参数(FieldsAllocationStyle)和字段在Java源码中定义顺序的影响。
    1. HotSpot虚拟机 默认的分配策略为longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers),从分配策略中可以看出,相同宽度的字段总是被分配到一起。在满足这个前提条件的情况下,在父类中定义的变量会出现在子类之前。如果 CompactFields参数值为true(默认为true),那子类之中较窄的变量也可能会插入到父类变量的空隙之中。

2.3、对齐填充(Padding):

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

3、对象大小计算

  1. 在32位系统下(java对象)
    1. Class指针:4字节
    2. MarkWord:4字节
    3. 对象头:8字节。
  2. 在64位系统下(java对象)
    1. Class指针:8字节
    2. MarkWord:8字节
    3. 对象头:16字节。
  3. 64位开启指针压缩的情况(java对象)
    1. Class指针:4字节
    2. MarkWord:8字节
    3. 对象头:12字节。
  4. 64位开启指针压缩的情况(数组对象)
    1. Class指针:4字节(未开启指针压缩为8字节)
    2. MarkWord:4字节(未开启指针压缩为8字节)
    3. 数组长度:4字节
    4. 对齐:4字节
    5. 总共:16字节
  5. 静态属性不算在对象大小内。

4、markword补充

对象需要存储的运行时数据很多,其实已经超出了32、64位Bitmap结构所能记录的限度,但是对象头信息是与对象自身定义的数据无关的额外存储成本,考虑到虚拟机的空间效率,Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。

4.1、HotSpot虚拟机对象头Mark Word

在32位的HotSpot虚拟机中对象未被锁定的状态下,Mark Word的32个Bits空间中的25Bits用于存储对象哈希码(HashCode),4Bits用于存储对象分代年龄,2Bits用于存储锁标志 位,1Bit固定为0(下图的无锁太那行对应的数据) 。

在这里插入图片描述

4.2、案例

4.2.1、在Hotspot JVM中,32位机器下,Integer对象的大小是多少?

根据普通对象实例与数组对象实例的数据结构图,那么我们可以得出Integer的对象的结构如下:

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

4.2.2、在Hotspot JVM中,32位机器下,数组对象的大小是多少?

​​

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM--基础--21--对象的内存布局 的相关文章

随机推荐

  • 加入ehcache后,系统出现内存泄漏,解决办法

    最近在系统中 加入缓存ehcache 但发现 每隔一天 服务器就会报出内存溢出 问题严重 后来在网上查资料发现 一篇解释的网文 spring中的提供了一个名为org springframework web util Introspector
  • Android从源码分析RecyclerView四级缓存复用机制一(缓存ViewHolder)

    RecyclerView相比较ListView先说多了多布局和缓存 目前已经在Android列表中大量普及使用 面试中也经常问到 所以对于RecyclerView的四级缓存机制也叫复用回收机制的分析很有必要 这部分很重要请 全村人来听 先说
  • Understanding Dataset Design Choices for Multi-hop Reasoning

    Understanding Dataset Design Choices for Multi hop Reasoning NAACL 2019 阅读笔记 记录论文中几个有趣的实验 1 单句包含答案实验 首先做了一个简单的实验 给模型输入一个
  • 游戏盾原理和优势

    什么是游戏盾呢 游戏盾是DDoS高防IP产品系列中针对游戏行业的安全解决方案 游戏盾专为游戏行业定制 针对性解决游戏行业中复杂的DDoS攻击 游戏CC攻击等问题 目前以对抗的形式存在的高防产品形态 也就是防御带宽要大于攻击者的流量 游戏盾有
  • 最大熵算法及简单例子

    最近在学模式识别 正在看Introduction to Pattern Recognition这本书 挺不错的一本书 好 下面和大家一起来学习最大熵算法 首先 最大熵算法是干什么的呢 一般是用来估计一个分布 至于把分布估计出来之后用来干什么
  • 程序员必备的画图工具

    作者 CUGGZ 来源 前端充电宝 XMind 是一个跨平台的思维导图软件 具有多种结构样式 除了普通的思维导图 还包括树形图 逻辑图 鱼骨图 时间轴 树状表格等等 不同的结构样式可以自由组合混用 同时支持一键更换结构样式 最近经常有小伙伴
  • 编译安装 Nginx 提示:/configure: error: C compiler cc is not found

    问题产生背景 反向代理服务器需要增加探活功能 需要对前置nginx 进行重新编译安装第三方模块 发现在编译安装配置时候一直过不去 百度查询过很多解决办法 基本都是没有安装好编译环境之类的说法 但是在确定编译环境所涉及的包全部都安装以后 还是
  • idea必备开发插件.

    1 lombok 支持lombok的各种注解 从此不用写getter setter这些 可以把注解还原为原本的java代码 非常方便 https plugins jetbrains com plugin 6317 lombok plugin
  • 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)-RC-u5 树与二分图

    2022 RoboCom 世界机器人开发者大赛 本科组 省赛 RC u5 树与二分图 文章目录 2022 RoboCom 世界机器人开发者大赛 本科组 省赛 RC u5 树与二分图 题目描述 输入格式 输出格式 输入样例 输出样例 思路 A
  • 感知机分类学习

    感知机 perceptron 是一种二类分类的线性分类模型 也就是说 使用于将数据分成两类的 并且数据要线性可分的情况 线性可分是指存在一个超平面能够将空间分成两部分 每一部分为一类 感知机的目的就在于找这样的一个超平面 假设输入数据形式为
  • pandas入门

    pandas is a fast powerful flexible and easy to use open source data analysis and manipulation tool 一 读取文本文件中的数据 导入pandas
  • Python之创建多级菜单

    方法一 usr bin env python coding utf 8 Time 2021 11 25 19 09 Author Argonaut FileName 创建多级菜单 py 功能 可进可退的功能菜单 while True pri
  • 将C盘和桌面所在的E盘合并分区后,出现的路径问题解决方案

    问题一 开机时出现警告 由于启动计算机时出现页面配置问题 Windows在您的计算机上创建了一个临时页面文件 所有的磁盘驱动器的总页面大小可能稍大于您所指定的大小 解决方案 照着做就行 问题二 Windows 10系统开机显示 位置不可用C
  • shell脚本整段注释

    摘自 http zhidao baidu com link url XmCCZmfluRe6n8TjPRKJTx4GGOUPSGX1VNBm euqGdpKGpveTESxC0HL90UBNT5nZCvmvfq2oIJdP3JO5EoPSq
  • STM32关于PVD低电压能检测的知识

    在实际工程运用中需要对突发情况作出及时的相应 通常都需要考虑当系统电压下降或断电时 需要对控制系统加以保护 这时候就需要在程序中加入系统电压监测 PVD 供电电压降低到某一个电压值时 需要系统进入保护状态 执行紧急关闭任务 对系统数据进行保
  • DDR基础知识点汇总

    文章目录 文档推荐 DDR颗粒的电路图来源 DDR3 SDRAM电路结构高清图 DDR4 SDRAM电路结构高清图 DDR3 1866控制器 PHY 颗粒之间的带宽关系 channel gt DIMM gt rank gt chip gt
  • docker镜像中配置文件的修改

    docker镜像中配置文件的修改 需要修改docker里面的配置文件时 因为docker镜像里面没有vim 下载也比较麻烦 可以使用 docker cp docker镜像名 想要修改的文件的路径 想要复制到的路径 将镜像中的文件复制到镜像外
  • ARM芯片开发(S5PV210芯片)——定时器、看门狗、RTC

    1 计数器 计数器就是每隔一段固定的时间计数值就加一 于是我们可以根据计数值来计算时间 经过的时间 计数值x计数时间间隔 2 定时器 2 1 定时器介绍 定时器具有计时的功能 类似于我们手机自带的倒计时功能 比如我们先给定时器设置计时一小时
  • 从瀑布到敏捷——漫画解读软件开发模式变迁史

    网址 https www tapd cn forum view 36971 从文章中可知 1 瀑布模型 将客户隔绝在外并按顺序逐一完成的模式 从时间上来说 只有等上一交付件完成了 下一阶段才能开始是一种浪费 特点 文档驱动 单道生产 2 敏
  • JVM--基础--21--对象的内存布局

    JVM 基础 21 对象的内存布局 1 普通对象实例与数组对象实例的数据结构图 2 在HotSpot虚拟机中 对象在内存中存储的布局如下 2 1 对象头 Header 2 1 1 markword 用于存储对象自身的运行时数据 如哈希码 H