Java中各种数据类型对内存占用的情况是什么


这篇文章主要介绍“Java中各种数据类型对内存占用的情况是什么”,在日常操作中,相信很多人在Java中各种数据类型对内存占用的情况是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中各种数据类型对内存占用的情况是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!内存公式:Java对象的内存布 = 对象头(Header) + 实例数据(Instance Data) + 补齐填充(Padding)。补齐填充:Java对象占用空间是8字节对齐的,即所有Java对象占用bytes数必须是8的倍数Shallow Size对象自身占用的内存大小,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。
针对数组类型的对象,它的大小是数组元素对象的大小总和。Retained SizeRetained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。接下来用JProfiler验证:1.新建一个空对象,观察空对象内存占用结论:一般自建空对象占用内存 16b,16 = 12(Header) + 4(Padding)2.在TestObj中新增一个 int 属性,观察对象内存占用结论:int 占用 4b, 16 = 12(Header) + 4(int)3.在TestObj中新增一个 long 属性,观察对象内存占用结论:long 占用 8b, 24 = 12(Header) + 8(long) + 4(Padding)其余基本类型可以参照以上自行验证,原理一样包装类(Boolean/Byte/Short/Character/Integer/Long/Double/Float)占用内存的大小 = 对象头大小 + 底层基础数据类型的大小包装类和其他引用类一样,会产生一个引用(reference)1.在TestObj中新增一个 Integer 属性,观察对象内存占用对象占用内存 32b,如图结论:Integer 占用 16b, 32 = 12 (Header) + 16(Integer) + 4(reference)特别的:-128~127 在常量池,只占用 4b,且不产生引用(reference)2.在TestObj中新增一个 Long 属性,观察对象内存占用结论:Long 占用 24b, 40 = 12 (Header) + 24(Long) + 4(reference)其余包装类型可以参照以上自行验证,原理一样64位机器上,数组对象的对象头占用24 bytes,启用压缩后占用16字节。比普通对象占用内存多是因为需要额外的空间存储数组的长度(普通16b-12b)。对象数组本身的大小=数组对象头 + length * 存放单个元素大小在TestObj中新增一个 char[] 属性,观察对象内存占用结论:char[3] 占用 24b, 24 = 40 – 16,24 = 16(Header) + 3 * 2(char) + 2(Padding)封装类型数组比基本类型的数组,需要多管理元素的引用对象数组本身的大小=数组对象头+length * 引用指针大小 + le免费云主机域名ngth * 存放单个元素大小在TestObj中新增一个 Integer[] 属性,观察对象内存占用结论:Integer[3] 占用 80b, 80 = 96 – 16, 80 = 16(Header) + 3 * 4 (reference)+ 3 * 16(Integer) +4(padding)在TestObj中新增一个空 String 属性,观察对象内存占用结论:String 本身占用 24b, 24 = 40 -16也就是说空””也需要16b注意:这里为什么要写String s = new String(“”)?请自己思考,不写会怎么样?答:如果写成String s = “”,是不会再堆中开辟内存的,也就看不到String占用的空间,你看到的将会是下面的,至于为什么,都是因为final到此,关于“Java中各种数据类型对内存占用的情况是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: C语言中堆排序怎么用

小编给大家分享一下C语言中堆排序怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!???? 堆排序(Heapsort):利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 09/08 17:23
Next 09/08 17:23

相关推荐