Java基础 | 对象在内存中的存储布局以及如何计算对象的大小

本文详细介绍了Java对象在内存中的存储布局,包括对象头、实例数据和对齐填充三部分,并给出了不同数据类型的内存占用。同时,讨论了如何在32位和64位系统下计算对象大小,以及在开启或关闭UseCompressedOops参数时的影响。通过对不同类型对象的实例分析,展示了对象内存的实际分布和对齐策略。

总结图

image

Java 内存结构

第一部分:对象头
  1. markword:用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁等。这部分数据长度在32位机器和64位机器虚拟机中分别为4字节和8字节(64位的JVM为了节约内存可以使用选项+UseCompressedOops开启指针压缩,开启该选项后,占用字节数降为4字节);
    image

  2. 类型指针:即对象指向它的类元数据(保存在方法区)的指针,虚拟机通过这个指针来确定这个对象属于哪个类的实例,指针占用4个字节(64位机器占8个字节);

  3. 数组长度(只有数组对象才有):如果是 Java 数组,对象头必须有一块用于记录数组长度的数据,用4个字节int来记录数组长度;

第二部分:实例数据

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

原生类型的内存占用情况如下:

  • boolean 1
  • byte 1
  • short 2
  • char 2
  • int 4
  • float 4
  • lo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值