Java对象背后的故事(中)
9月21日 老巫婆投稿 在上篇文章中介绍一个对象的组成部分主要分为三部分。对象头、实例数据、填充对齐。实例数据。这里我们就继续分析这三部分中具体的组成情况。
为了证实一个对象存在这3个部分。这里使用JOL(Javaobjectlayout是分析JVM中对象布局的工具,该工具大量使用了Unsafe、JVMTI来解码布局情况)来分析。这里使用0。16版本。目前市面的电脑绝大多数多是64位操作系统,这里也基于64位操作系统来展开讲解,32位的大家知道就可以了。本人电脑操作系统MacOSMonterey12。2。1。dependencygroupIdorg。openjdk。jolgroupIdjolcoreartifactIdversion0。16versiondependency
Hotspot虚拟机文档oopsoop。hp有对Markword字段的定义Bitformatofanobjectheader(mostsignificantfirst,bigendianlayoutbelow):32bits:hash:25age:4biasedlock:1lock:2(normalobject)JavaThread:23epoch:2age:4biasedlock:1lock:2(biasedobject)size:32(CMSfreeblock)PromotedObject:29promobits:3(CMSpromotedobject)64bits:unused:25hash:31unused:1age:4biasedlock:1lock:2(normalobject)JavaThread:54epoch:2unused:1age:4biasedlock:1lock:2(biasedobject)PromotedObject:61promobits:3(CMSpromotedobject)size:64(CMSfreeblock)unused:25hash:31cmsfree:1age:4biasedlock:1lock:2(COOPsnormalobject)JavaThread:54epoch:2cmsfree:1age:4biasedlock:1lock:2(COOPsbiasedobject)narrowOop:32unused:24cmsfree:1unused:4promobits:3(COOPsCMSpromotedobject)unused:21size:35cmsfree:1unused:7(COOPsCMSfreeblock)
理论上一个空对象的大小为对象头大小12字节(Markword8字节、classpointer4字节),考虑到8字节对齐填充,需要补齐4字节为8的2倍16字节。
我们来new一个空对象publicclassAnalysisObject{}
使用JOL分析AnalysisObject对象信息publicstaticvoidmain(String〔〕args){AnalysisObjectobjectnewAnalysisObject();System。out。println(ClassLayout。parseInstance(object)。toPrintable());}
输出结果信息com。github。sylphlike。web。AnalysisObjectobjectinternals:OFFSZTYPEDESCRIPTIONVALUE08(objectheader:mark)0x000000000000000d(age:1)84(objectheader:class)0x00066a48124(objectalignmentgap)Instancesize:16bytesSpacelosses:0bytesinternal4bytesexternal4bytestotal
表头依次为OFF:在内存中的起始位置SZ:占用大小(字节)TYPEDESCRIPTION:类型VALUE:具体值
(objectheader:mark)对应MarkWord,占用大小8byte
(objectheader:class)对应classpointer占用大小4byte
(objectalignmentgap)对应Padding占用大小为4
Instancesize对象占用的总字节数大小
Spacelosses对应对齐填充大小
接下来我们给对象添加一下属性方法。publicclassAnalysisObject{privateSprivateIpublicvoidmethod(){}}
输出结果信息com。github。sylphlike。web。AnalysisObjectobjectinternals:OFFSZTYPEDESCRIPTIONVALUE08(objectheader:mark)0x000000000000000d(age:1)84(objectheader:class)0x00066a48124intAnalysisObject。i0168doubleAnalysisObject。d0。0241booleanAnalysisObject。bfalse253(alignmentpaddinggap)284java。lang。StringAnalysisObject。snull324java。lang。IntegerAnalysisObject。innull364(objectalignmentgap)Instancesize:40bytesSpacelosses:3bytesinternal4bytesexternal7bytestotal
从结果中看出对象占用40字节大小。Instancesize:40bytes。一共5个属性,一个方法。int占4字节、boolean占1字节、double占8字节、Integer和String为引用类型所以占4字节。
从上面结果中我们还发现有两种填充方式3bytesinternal和4bytesexternal。为什么存在两种填充方式?这里先给出结论。后面再探讨该问题;出现(alignmentpaddinggap)有以下两种情况
1、如果都是基本数据类型,只有当不存在4字节的,或者小字节加起来填不满4字节,且所有字节和大于4的时候触发alignmentpadding
2、如果实例数据存在非基本数据类型,也就是引用数据类型,先罗列并计算所有的基本类型数据的字节和,如果字节和不是4的倍数,那么此时会触发alignmentpadding。
Markword中存放的数据在对象的整个生命周期内都是非常关键的,放在后后一篇文章中单独来阐述。
投诉 评论
暗物质探索者悟空号科学史小画编者按:中科院之声不定期手绘一张科学史小画,为大家介绍一段科学史和其背后的故事。暗物质作为一种人类无法用正常途径观测到的宇宙粒子,也是一种颠覆认知但确实存在的物质,其很有……
3500元左右买什么手机这三款配置丰富性能媲美旗舰机颜值也不9月了,你买到心仪的手机了吗?预算多少呢?如果你预算3500元左右,今天我就推荐你三款配置丰富性能媲美旗舰机,当然颜值也不落下,看看你喜欢哪款?努比亚Z40SPro努比亚……
秋天小西装怎么搭配种打造完美衣橱小西装外套是人手必备的扮靓利器,不管是出席商务场合还是和闺蜜出街,休闲小西装总能搭出不一样的时髦style,下面就一起来看看时髦潮人们都是如何玩转小西装的吧。STYLE1……
内部系统也需要用户体验设计几天前,想把上个月校园招聘的餐旅费报销一下。结果在公司内网的报销系统折腾了三个半小时才搞定。看看自己报销的金额:802块。觉得挺无奈,花了三个多小时的工作时间,竟然为了报销80……
恒大汽车被曝变相裁员再传苹果AR头显或将发布依据爆料,恒大恒驰新能源员工停工留职,自即日起迎来了横跨整个春节的超长假期,累计有90天之久。1、国美电器回应被申请破产清算:未收到法律文件、会负责任12月1日消息,国美……
国足为何惨败越南?李霄鹏说是战术和情绪,但根源恐怕在归化球员13输给越南,还是在补时阶段才追回一球,国足的表现让人诧异:他们难道这么差了吗?完败给日本也就罢了,在越南面前都被打得没有还手之力?从赛前的言论来看,国足上下其实很有信心……
安全帽都有什么材质的劳动防护用品对于保护职工在生产劳动过程中的安全健康发挥着重要作用。那么,安全帽都有什么材质的那?就让本站的小编和你一起去了解一下吧!安全帽常用材料:生产安全帽的材料……
罗马元老院与人民讲的什么罗马元老院与人民书评《罗马元老院与人民》一直是近年来最畅销的史书之一。作者通过考古学、钱币学等多个领域的研究,为读者打造了一部更加有趣、生动的罗马通史。相信喜欢历史的朋友,肯定会对古罗马抱有兴趣,……
肾炎有五大早期症状1、血尿:部分患者会出现肉眼可见的红色尿液,也有部分患者在进行尿常规检查时,会发现尿液中有红细胞。2、蛋白尿:患者在排尿时会发现尿液中存在很多细小泡沫,这些泡沫并不会在排……
浅析电商购物流程设计畅游在各大电商网站的你,在网购时不知曾否察觉到有些小不同?排开具体的商品内容、视觉样式,回忆下那些我们熟悉的商品页面当然,这里并不是玩大家来找茬游戏的,需要火眼金睛审视于……
隐藏于女人的经济奥秘一年以来,人们耳边每天听到最多的词就是金融风暴、经济危机,但是经济形势到底怎么样,我们的生活究竟有没有受影响?回答这些问题似乎都是专家的事,普通老百姓大多数连GDP、CPl是什……
洛杉矶新能源计划和或将被迫更换电动汽车【智车派新闻】2019年11月,洛杉矶的清洁技术倡导组织发布了2028年零排放路线图2。0。当时,洛杉矶市长埃里克加西蒂(EricGarcetti)也呼吁到2028年将空气污染……