Java对象背后的故事(中)
在上篇文章中介绍一个对象的组成部分主要分为三部分。对象头、实例数据、填充对齐。实例数据。这里我们就继续分析这三部分中具体的组成情况。
为了证实一个对象存在这3个部分。这里 使用 JOL(Java object layout 是分析 JVM 中对象布局的工具,该工具大量使用了 Unsafe、JVMTI 来解码布局情况)来分析。这里使用0.16版本。目前市面的电脑绝大多数多是64位操作系统,这里也基于64位操作系统来展开讲解,32位的大家知道就可以了。本人电脑操作系统 MacOS Monterey 12.2.1。 org.openjdk.jol jol-core 0.16
Hotspot 虚拟机文档 "oops/oop.hp" 有对 Markword 字段的定义 Bit-format of an object header (most significant first, big endian layout below): 32 bits: -------- hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object) JavaThread*:23 epoch:2 age:4 biased_lock:1 lock:2 (biased object) size:32 ------------------------------------------>| (CMS free block) PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object) 64 bits: -------- unused:25 hash:31 -->| unused:1 age:4 biased_lock:1 lock:2 (normal object) JavaThread*:54 epoch:2 unused:1 age:4 biased_lock:1 lock:2 (biased object) PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object) size:64 ----------------------------------------------------->| (CMS free block) unused:25 hash:31 -->| cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && normal object) JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && biased object) narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object) unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block)
理论上一个空对象的大小为对象头大小12字节(Markword 8字节、class pointer 4字节),考虑到8字节对齐填充,需要补齐4字节为8 的2倍16字节。
我们来new一个空对象 public class AnalysisObject { }
使用JOL分析AnalysisObject对象信息 public static void main(String[] args) { AnalysisObject object = new AnalysisObject(); System.out.println(ClassLayout.parseInstance(object).toPrintable()); }
输出结果信息 com.github.sylphlike.web.AnalysisObject object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) 0x000000000000000d (biasable; age: 1) 8 4 (object header: class) 0x00066a48 12 4 (object alignment gap) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
表头依次为 OFF:在内存中的起始位置 SZ:占用大小(字节)TYPE DESCRIPTION: 类型 VALUE:具体值
(object header: mark) 对应MarkWord,占用大小8byte
(object header: class) 对应 class pointer 占用大小4byte
(object alignment gap) 对应 Padding 占用大小为4
Instance size 对象占用的总字节数大小
Space losses 对应对齐填充大小
接下来我们给对象添加一下属性方法。 public class AnalysisObject { private String s; private int i; private boolean b; private double d; private Integer in; public void method(){} }
输出结果信息 com.github.sylphlike.web.AnalysisObject object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) 0x000000000000000d (biasable; age: 1) 8 4 (object header: class) 0x00066a48 12 4 int AnalysisObject.i 0 16 8 double AnalysisObject.d 0.0 24 1 boolean AnalysisObject.b false 25 3 (alignment/padding gap) 28 4 java.lang.String AnalysisObject.s null 32 4 java.lang.Integer AnalysisObject.in null 36 4 (object alignment gap) Instance size: 40 bytes Space losses: 3 bytes internal + 4 bytes external = 7 bytes total
从结果中看出对象占用40字节大小。Instance size: 40 bytes. 一共5个属性,一个方法。int占4字节、boolean占1字节、double占8字节、Integer和String为引用类型所以占4字节。
从上面结果中我们还发现有两种填充方式 3 bytes internal 和 4 bytes external. 为什么存在两种填充方式?这里先给出结论。后面再探讨该问题;出现(alignment/padding gap)有以下两种情况
1、如果都是基本数据类型,只有当不存在4字节的,或者小字节加起来填不满4字节,且所有字节和大于4的时候触发alignment/padding
2、如果实例数据存在非基本数据类型,也就是引用数据类型,先罗列并计算所有的基本类型数据的字节和,如果字节和不是4的倍数,那么此时会触发alignment/padding。
Markword中存放的数据在对象的整个生命周期内都是非常关键的,放在后后一篇文章中单独来阐述。
嫪毐之乱背后的宫斗戏码受李开元和芜史启发,对嫪毐之乱有一个新的推测和猜想这场变乱实际上是秦王嬴政的嫡祖母华阳太后和母亲赵姬及各自代表的政治势力之间的一场权力争夺战。嫪毐等人(包括幕后的太后赵姬,此时相邦
大明最强太子当面顶撞朱元璋,朱标凭什么这么受宠?元朝至正十五年,朱标出生了。可以说,他的生活条件应该比他的父亲朱元璋好亿点。在这个时候,朱元璋已经离开起义军领袖郭子兴,白手起家,自立门户,打拼得相当红火。朱标出生这一年,朱元璋二
离天堂太远,离美国太近为何美国是墨西哥毒品泛滥的根源美国是世界上最强大的国家,也是世界头号经济强国,人均GDP接近7万美元,还有着相对完善的社会福利制度,与美国只有一墙之隔的墨西哥,则毒品泛滥帮派林立,社会动荡不安。墨西哥流传着这样
此次机构改革是改革的拐点改革的改革从外求西方转向内求自身此次国务院机构改革,实际上也是中国改革自身的拐点,甚至也是近代以来中国历史的拐点。以前的改革,在方向和方式上,都是朝向西方的,但此次改革却是朝向中国自身的。在以前的改革思维中,以中
英国太空探索负责人称外星人肯定存在据镜报报道,英国太空探索部负责人利比杰克逊说,人类不可能是宇宙中唯一的生命形式。他表示,外星人的存在不是一个是否存在的问题,而更多的是一个我们何时能找到更多答案的问题,以解决这些紧
会拐弯的光,带领人类刷新了对宇宙的认知光有重量吗?它受不受引力的作用?这个问题曾引起许多著名物理学家的好奇心,正因为对它不懈地思索,促使爱因斯坦建立著名的广义相对论,而对这个问题的实验观察,又使广义相对论的正确性得以验
零跑抢走新能源车的定价权做用户的代工厂,用更少的钱,买更好的产品。打掉虚高的品牌溢价,给用户最具诚意的产品。3月1日的零跑新品发布会上,零跑汽车董事长创始人朱江明不断重复着品价比的发展思路。在他看来,现阶
数字化时代,你应该知道的BI我曾经看到有人在讨论过商业智能BI的部署对于企业是否有实际意义,现在市场的数据已经证明商业智能BI在商业世界中,在企业的实践中证明了自己的价值,得到了广泛的认可。一什么是BI有一点
万物互联6G概念领涨数字经济,重点概念股梳理6G是实现万物互联和数字经济发展的核心技术东风吹,战鼓擂!数字经济的东风愈刮愈烈,今天扩散到了通讯6G,6G是实现万物智联的关键底层技术,是数字经济发展的核心技术。在流浪地球2中,
辛巴炮轰情感主播造假背后,平台去头部化切割利益蛋糕快手知名主播辛巴又在直播间开骂了。3月8日,辛巴在快手平台直播过程中,指责快手纵容情感主播制造虚假人气和虚假数据坑骗老人,剧本编排骗老人。直播间造假十万加,快手你们管不管?同时质问
诸葛亮自比管仲,历史中二位圣贤才能可否高下立判?世人皆言诸葛孔明乃神人也!而诸葛亮却自比管仲乐毅。这到底是自谦,还是装,抑或是二者皆有。大家好,我是潜心,把历史还给百姓,用心传递智能量。今天好兄弟们一起探讨一下诸葛孔明与管仲二人