-
Java对象的大小,包括 对象头部信息、实例数据、对齐填充
-
对象头部信息
● HotSpot虚拟机的对象头包括两部分信息:markword和class 。● 虚拟机类型可通过 System.getProperty(“java.vm.name”) 获取
● markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。
● 另外一部分是class类型指针,即对象指向它的类元数据(在方法区)的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
● 但,并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据信息并不一定要经过对象本身
● 如果对象是一个数组,那么头部信息中还必须包括数组的长度信息,int类型, 4字节
● 在32位系统下,存放Class指针的空间大小是4字节,MarkWord是4字节,对象头总计为8字节。
● 在64位系统下,存放Class指针的空间大小是8字节,MarkWord是8字节,对象头总计为16字节。
● 在64位系统开启指针压缩的情况下(-XX:+UseCompressedOops),存放Class指针的空间大小是4字节,MarkWord是8字节,对象头总计为12字节。
● 如果对象是数组,需要额外增加4个字节的空间,记录数组长度
-
实例数据
● 实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要记录起来
-
对齐填充
● 对齐填充,并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。这是由于HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说,就是对象的大小必须是8字节的整数倍。
-
Java中查看对象在内存中大小
● ObjectSizeCalculator.getObjectSize(对象)
● 该方法是java 1.8的方法
-
案例(HotSpot虚拟机,开启指针压缩)
● 普通java对象的大小
● 不包含任何属性,头部12字节,对齐填充4字节,总计16字节
● 只包含一个对象引用,头部 12字节,对象引用4字节,总计16字节
● 针对HashMap类型,初始大小即为48字节,从大小上考虑,从数据库中获取数据,也应该少用map
JVM(笔记)—— 对象的内存布局
最新推荐文章于 2024-06-12 15:51:38 发布