Java对象的字节大小计算
一、java基本类型长度及对应对象的字节长度
基本类型
长度(字节)
对象长度(字节)
int
4hr16hrshort
2hr16hrlong
8hr24hrbyte
1hr16hrchar
1hr16hrfloat
4hr16hrdouble
8hr24System。out。println(Integer:ClassLayout。parseInstance(Integer。valueOf(122))。toPrintable());
输出Integer:java。lang。Integerobjectinternals:OFFSETSIZETYPEDESCRIPTIONVALUE04(objectheader)01000000(00000001000000000000000000000000)(1)44(objectheader)00000000(00000000000000000000000000000000)(0)84(objectheader)642200f8(01100100001000100000000011111000)(134208924)124intInteger。value122Instancesize:16bytesSpacelosses:0bytesinternal0bytesexternal0bytestotal
二、对象内部组成
普通对象实例
对象头
身体
填充对齐
mark
class指针
对象实际数据
padding
数组对象实例
对象头
身体
填充对齐
mark
class指针
数组Length
对象实际数据
padding
注:数组实例对象中对象头多了一个记录数组长度的int类型对象,占4字节
对象头:
第一个部分mark,用于存储对象的运行时数据,比如哈希码(hashCode)、GC年龄分代、锁状态标志、线程持有的锁、偏向线程id、偏向时间戳等。另外一部分class指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的。
对象头占用空间:
1、在32位系统下,存放class指针的空间大小是4字节,MarkWork是4字节,对象头为8字节。
2、在64位系统下,存放Class指针的空间大小是8字节,MarkWordk是8字节,对象头尾16字节。
3、在64位开启指针压缩的情况下(XX:UseCompressedOops),存放class指针的空间大小是4字节,markWord是8字节,对象头为12字节。
注:在开启指针压缩要求内存必须在4GB32GB,因为32位指针寻址4GB,按8字节对齐,4832GB,按更大对齐可以寻址更大空间,但是浪费就更大了。
注:指针压缩不能压缩mark,指向非堆(Heap)的对象指针,局部变量、传参、返回值、NULL指针。
实例数据:
实例数据是对象存储的有效数据,也是程序代码中所定义的各种类型的字段内容,无论是从父类继承下来的,还是从子类中定义的,都需要记录起来。
对齐填充:
最后一块对齐填充空间并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用,这是由于HotSpotVM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说,就是对象的大小必须是8字节的整数
空对象:
(此处的空对象是指类中没有任何基础类型和引用,不是对象null)publicclassMyTest{Testpublicvoidtest(){AanewA();System。out。println(ClassLayout。parseInstance(a)。toPrintable());}}classA{}
关闭指针压缩
(XX:UseCompressedOops)
类A没有值类型和引用类型对象大小应该为8(markword)8(klass)16byteOFFSETSIZETYPEDESCRIPTIONVALUE04(objectheader)01000000(00000001000000000000000000000000)(1)44(objectheader)00000000(00000000000000000000000000000000)(0)84(objectheader)f0e2ba17(11110000111000101011101000010111)(398123760)124(objectheader)00000000(00000000000000000000000000000000)(0)Instancesize:16bytes
开启指针压缩
对象大小应该为8(markword)4(klass)因为对象大小最后要能被8整除,所以还要所以还要4的的填充对齐,最后大小还是16byteOFFSETSIZETYPEDESCRIPTIONVALUE04(objectheader)01000000(00000001000000000000000000000000)(1)44(objectheader)00000000(00000000000000000000000000000000)(0)84(objectheader)c8160120(11001000000101100000000100100000)(536942280)124(lossduetothenextobjectalignment)Instancesize:16bytes
注:64位系统内存大于4GB且小于32GBJVM默认开启指针压缩。
三、普通对象publicclassMyTest{Testpublicvoidtest(){AanewA();System。out。println(ClassLayout。parseInstance(a)。toPrintable());}}classA{inta;floatb;longc;Stringd;}
关闭指针压缩:
对象大小应该是8(markword)8(Klass)4(int)4(float)8(long)8(string)(引用指针)40byteOFFSETSIZETYPEDESCRIPTIONVALUE04(objectheader)01000000(00000001000000000000000000000000)(1)44(objectheader)00000000(00000000000000000000000000000000)(0)84(objectheader)58e3e917(01011000111000111110100100010111)(401204056)124(objectheader)00000000(00000000000000000000000000000000)(0)168longA。c0244intA。a0284floatA。b0。0328java。lang。StringA。dnullInstancesize:40bytes
开启指针压缩:
对象大小应该是8(markword)4(Klass)4(int)4(float)8(long)4(string)(因为开启了指针压缩所以引用指针也是4byte)32byteOFFSETSIZETYPEDESCRIPTIONVALUE04(objectheader)01000000(00000001000000000000000000000000)(1)44(objectheader)00000000(00000000000000000000000000000000)(0)84(objectheader)c8160120(11001000000101100000000100100000)(536942280)124intA。a0168longA。c0244floatA。b0。0284java。lang。StringA。dnullInstancesize:32bytes
开启关闭指针压缩的结果区别:
主要区别就是让原本占用8字节的指针缩小到4字节,另外未开启指针压缩时,上面提到的基本类型内存填充将会以8对齐,开启时以4字节对齐。但是对象尾部的填充不管是否开启都是以8字节对齐。
使用网上找的jar有个弊端
用这种方式只可以看到当前对象的大小,它所引用的对象实例大小是不会计算在里面的。如果要计算当前对象和对象引用的所有对象实例可以使用下面介绍的这个方法
可以使用jdk自带的jdk。nashorn。internal。ir。debug。ObjectSizeCalculator;可以评估出对象的大小。
System。out。println(Integer:ObjectSizeCalculator。getObjectSize(Integer。valueOf(122)));
描写猫头鹰与猫的优秀作文从前有户人家,家里养了一只猫和一只猫头鹰。猫很懒,每天吃饱饭以后,就在院子里散步。主人以为它在巡逻,就夸奖它是一只勤快的猫。猫头鹰很勤快,但它却是在白天睡觉,晚上工作,主……
淘宝个人店铺升级为企业店铺,有什么好处?有什么坏处?企业店铺是鸡肋,其实没什么用。以前阿里一加独大,电商流量主要集中在天猫和淘宝。时过境迁,现在,阿里碰到京东,苏宁,拼多多和唯品会,网易考拉和严选的强力竞争。还有中石油,石化等国……
初冬的早晨关于冬天作文听妈妈说初冬的早晨格外美丽,我真想亲眼看看。这天我起了个早,一个人来到家后面的田野里,去领略初冬早晨的景色。走在田野里,我眺望东方,看到一缕缕霞光透过薄薄的云层洒向……
恐龙外衣的故事我有上百件衣服。但我最喜欢还是那件恐龙外衣。那件衣服是我生日时外公送给我的。那件衣服有个帽子,帽子上有一根长长的尖刺,还有一张血盆大口,它的背面也有很多根坚刺。那件衣服除……
iPhone13Pros石墨色比其它颜色贵的原因我们消费者去购买手机,考虑的无非这几个方面,手感,屏幕,外观,颜色,处理器,像素续航,快充,而外观尤其是手机的颜色,是我们看到手机的第一感觉,好看或者不好看,从来没有遇到过同一……
国内互联网公司都没有技术含量,都是贸易公司?最近这种言论甚嚣尘上,说国内互联网公司都是垃圾,没有真正的技术,我想从两个方面来聊一聊提一个问题,当你家发现邻居家有一台自行车的时候,你家是用钱去买一辆还是抓紧在家研究自……
快乐的童年作文这就是我的童年,一个快乐、幸福的童年。下面是小编整理的范文,欢迎查阅!【快乐的童年生活作文一】回首,看着人生道路上一个个脚窝,有一个,陷地最深。那段日子,深深印在我的脑海……
路由器隔一段时间就上不了网,断一下电又能用了,这是什么原因?路由器隔一段时间就上不了网,断一下电又能用了,出现这种情况多是路由器死机造成的。从技术角度来说,路由器就是一个迷你版的电脑,也有处理器,内存和硬盘,当然了,路由器的硬盘多……
由老桥想到的满分作文导语:古往今来,桥之杰作数不胜数。艺术,技巧构成了各式各样的桥。往往一座桥就是一首具有独特的韵味诗歌。以下是小编为大家分享的由老桥想到的满分作文,欢迎借鉴!每天清晨,当我……
爱我家乡,爱我江北水城小学生作文在祖国的东面,有一个美丽的七彩城。它就是北水城。水城有山陕会馆、湖滨公园、姜堤乐园,还有环城湖。环城湖,就像一璀璨的流星,将落在聊城的西南部。水将城绕,城把水……
有没有好用的win10系统激活工具推荐?1、右击桌面左下角开始菜单2、单击WindowsPowerShell(管理员)3、输入代码slmgrskmskms。03k。org回车弹出的对话框单击确……
我们与文学同行作文800字文学是一座深不可测的殿堂,堆积着这个世界上穿越时空的最精炼最宝贵的只是结晶。文学是颗颗水晶珠子般在历史舞台上翻滚,折射出一个时代的凄美哀怨,串联起来,散发出光辉可以让历史延续。……
抛开爱国情节,华为手机性价比高吗?华为手机从来不考虑性价比,华为手机已经是一种奢侈品,持有一台华为手机已不单单是身份象征,所以但凡用性价比来评判华为手机那都是耍流氓。我都是使用华为的手机,除单位分配是新的……
撇开爱国情怀,如果华为手机跟苹果手机一样的价格,不会选择哪个买华为!华为贵也买!不会选择苹果。自从有智能手机以来,就没有选择过苹果。也不是什么爱国情怀,就是不喜欢。后来听说苹果手机还收集中国的个人信息,就更不喜欢了。一直以来都是在……
还记得智能手机之前的日子吗?怀念吗?感谢您的阅读!智能手机改变了我们的生活,现在基本上人手一部手机,即使几岁的小朋友手里都会拿着手机。智能手机它的变化确实是随着技术的进步以及消费者对于手机的需求而带来……
学习艺术的过程作文我的绘画之路写学过的某一种艺术,如:吹,拉学,弹,唱,书法,绘画,泥塑,雕刻hellip;hellip;写在学习某种艺术过程中发生的故事和感受。也可以写一写喜欢的一件艺术品或一次艺术……
将十无益进行到底五年级作文在平日的学习、工作和生活里,大家对作文都不陌生吧,作文是一种言语活动,具有高度的综合性和创造性。那么,怎么去写作文呢?下面是小编帮大家整理的将十无益进行到底五年级作文,希望对大……
小学生童年趣事作文300字篇一如果童年是蔚蓝的天空,那么童年的趣事就是翱翔在天空中的小鸟;如果童年是浩瀚的宇宙,那么童年的趣事就是一颗颗闪闪发光的星星。我的童年,有很多趣事,最有趣的就是那次打雪仗……
小树叶的旅行作文小树叶的旅行作文1一片小树叶从树上落了下来,被风刮来刮去,开始了一场奇妙的旅行。小树叶飘到小河边,看见小蚂蚁在河边哭泣。小树叶问:小蚂蚁,你为什么在河边哭呢?小蚂蚁……
写家人像什么动物的作文600字我们家庭成员,各有各的特点,就如同动物一样,各有各的本领,给家庭生活带来了无限的乐趣,也让我的成长幸福、丰富、快乐。麻雀mdash;mdash;妈妈我妈是个ldqu……
取消996后社会整体剩余时间的分配问题你的时间花在哪里,你的价值就体现在哪里。这是对个人而已,对整个社会来讲也是如此。先说结论:互联网个性化推荐和碎片化信息消磨了整体社会的剩余时间价值中国通过30……
大树与小草作文900字大树与小草不是同类,但它们同路。共同追寻着太阳的足迹,沐浴阳光撒向大地的温暖,和谐共生,向着太阳放歌!春雷送走冬的身影,小鸟在枝头唱出春的韵律,早春的风吹过枝头,大树摇摆……
下一个比尔盖茨?扎克伯格与年轻女性在夏威夷冲浪,上演摸头杀作为全球第五大富翁,脸书(Facebook)的CEO马克扎克伯格在私人生活方面很低调,很少有人看到他与妻子之外的异性同游,而在这周的星期日,有人发现了他正在和一位年轻的女性,在……
商人的经典名言1。最初如果认为不行,从开始有想法的那一刹那,就已经注定办不到。mdash;mdash;泽田秀雄(his公司总经理)2。我做决定时,相当重视数据资料,也很依赖直觉,绝不会……