JVM(笔记)—— 对象的内存布局

  1. Java对象的大小,包括 对象头部信息、实例数据、对齐填充

  2. 对象头部信息
    ● 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个字节的空间,记录数组长度

  3. 实例数据

    ● 实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要记录起来

  4. 对齐填充

    ● 对齐填充,并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。这是由于HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说,就是对象的大小必须是8字节的整数倍。

  5. Java中查看对象在内存中大小

    ● ObjectSizeCalculator.getObjectSize(对象)

    ● 该方法是java 1.8的方法

  6. 案例(HotSpot虚拟机,开启指针压缩)

    ● 普通java对象的大小

    ● 不包含任何属性,头部12字节,对齐填充4字节,总计16字节
    在这里插入图片描述
    ● 只包含一个对象引用,头部 12字节,对象引用4字节,总计16字节
    在这里插入图片描述
    ● 针对HashMap类型,初始大小即为48字节,从大小上考虑,从数据库中获取数据,也应该少用map

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值