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

HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充,其中对象头又分为:Mark World和Class Pointer,如下图:

对象内存结构

从上面的这张图里面可以看出,对象在内存中的结构主要包含以下几个部分:

1) Mark Word:对象的Mark Word部分占4个字节,其内容是一系列的标记位,比如轻量级锁的标记位,偏向锁标记位等等(32位)。

2) Class对象指针:Class对象指针的大小也是4个字节,其指向的位置是对象对应的Class对象(其对应的元数据对象)的内存地址(32位)。

3) 对象实际数据:这里面包括了对象的所有成员变量,其大小由各个成员变量的大小决定,比如:byte和boolean是1个字节,short和char是2个字节,int和float是4个字节,long和double是8个字节,reference是4个字节(32位)。

4) 对齐:最后一部分是对齐填充的字节,按8个字节填充(32位)。

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

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

Mark World

用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,这部分数据的长度在32位和64位的虚拟机(暂不考虑开启压缩指针的场景)中分别为32bit和64bit,官方称它为“Mark Word”。Mark Word被设计成一个非固定的数据结构以便在极小的空间内存储尽量多的信息,它会根据对象的状态复用自己的存储空间。

例如在32位的HotSpot虚拟机中对象未被锁定的状态下(无锁态),Mark Word的32个bit空间中的25bit用于存储对象哈希码,4bit用于存储对象分代年龄,2bit用于存储锁标志位,1bit固定为0,在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容如下表所示。

锁状态

锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级)。JDK 1.6中默认是开启偏向锁和轻量级锁的,我们也可以通过-XX:-UseBiasedLocking来禁用偏向锁。关于JVM锁优化:http://www.jianshu.com/p/2d72c6bab241

java对象的内存结构_Java对象在内存中的结构分析相关推荐

  1. java对象的内存结构_JAVA 对象内存结构

    JAVA对象内存结构 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头 markWo ...

  2. java的头怎么写_JAVA对象布局之对象头(Object Header)

    由于Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记字段用于增强对象功能 .在学习并发编程知识synchronized时,我们总是难以理解其实 ...

  3. jvm内存结构_聊聊JVM内存结构

    起因 我们经常会在面试的时候被问到JVM的内存结构,很多人会觉得这东西真的有用吗?也就是面试造火箭,入职拧螺丝.问这个就是纯粹来刁难人的吧. 但实际上,我们细想一下. •假设你不知道局部变量实际上属于 ...

  4. java 对象结构_java对象的结构

    在Hotspot JVM中,32位机器下,Integer对象的大小是int的几倍? 我们都知道在Java语言规范已经规定了int的大小是4个字节,那么Integer对象的大小是多少呢? 要知道一个对象 ...

  5. java对象的内存分配_java对象在内存的分配问题

    今天看到一个不错的PPT:Build Memory-efficient Java Applications,开篇便提出了一个问题,在Hotspot JVM中,32位机器下,Integer对象的大小是i ...

  6. java对象内存模型_Java对象的内存模型

    众所周知,函数调用在内存中是通过压栈,退栈实现的,而Java的方法调用则是在JVM栈中通过栈帧实现的,且所有的Java对象都只在堆上分配内存.那么一个Java对象在堆内存里到底长啥样呢?实际上,当一个 ...

  7. java 堆内存结构_JAVA之内存结构

    概述 JAVA是我们现在最常用的开发语言,而他的垃圾回收机制(Garbage Collection)的重要作用不言而喻,以下简称GC,所以了解GC至关重要,现本人对于GC机制以前的理解和现在的理解记录 ...

  8. java float内存结构_Java后端开发岗必备技能:Java并发中的内存模型

    欢迎关注专栏: Java架构技术进阶 .里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. JMM通过构建一个统一的内存模型来屏蔽掉不同硬件平台和不同操作系统之间的差异,让Jav ...

  9. java创建变量的过程_java 对象的创建过程

    初始化的顺序首先是static(如果它们尚未由前一次对象创建初始化,也就是new对象的时候,只执行一次static变量初始化),变量初始化顺序有变量在类的定义顺序决定的: 对象的创建过程,以Dog类为 ...

最新文章

  1. 实验一 框架的选择及其原因
  2. VDI序曲三十 APP-V4.6SP1之OFFICE07补丁升级
  3. Tensorflow2.0学习(八) — tf.dataset自定义图像数据集
  4. 为什么我用腾讯会议录屏没声音?教你一招搞定!
  5. KinectV2 Face Basic
  6. 1bit等于多少字节,换算方法?
  7. 【c++笔记一】名字空间(namespace)
  8. 计算机常见的运算符,常见运算符
  9. banner图如何放置
  10. 程序员的第三次 “创业” 我选择继续开发在线客服系统,终于得到了积极反馈
  11. Endnote X7 基本功能及实用笔记
  12. 容器云平台在企业中的落地实践
  13. 基于python的在线音乐系统设计与实现
  14. 小马智行与速腾聚创展开全面战略合作
  15. DateDiff 数据库时间差函数
  16. 能把计算机c盘我的文档,电脑c盘哪些文件可以删除,手把手教你c盘里哪些文件可以删除...
  17. 寻找中国最好百名产品经理:豆瓣阿北360周鸿祎
  18. 1.4 爬虫-笔趣阁获取小说例子
  19. 看完 GitHub 上这几个奇葩项目后,我忍不住笑了 233333
  20. PHP中iconv函数来转换编码,如UTF-8转GB2312

热门文章

  1. 中国即时护理胆固醇监测设备行业市场供需与战略研究报告
  2. vue-router路由懒加载(解决vue项目首次加载慢)
  3. 为什么不用mysql做数据仓库hdfs_为什么不建议将RAID用于Hadoop HDFS设置?
  4. java程序能转变为javafx_躁!DJ 风格 Java 桌面音乐播放器
  5. 面向现代化应用,火山引擎云原生究竟提供了哪些能力?
  6. 横扫六大权威榜单后,达摩院开源深度语言模型体系 AliceMind
  7. 破解技术人才招聘难、培养难!CSDN 软件工程师能力认证标准正式开源开放
  8. 两大方案,只为写出更安全的代码!
  9. Flutter 即将占领整个 Web 开发
  10. 第十一届中国开源黑客松+中国程序员节重磅来袭,这里将有你不能错过的精彩。...