对象内存分布(计算对象的大小)

本文探讨了Java对象在内存中的分布,包括普通对象和数组对象的结构。对象头包含markword,ClassPointer指向类对象,实例数据存储字段值,而数组对象还有额外的数组长度信息。对象的大小受到64位操作系统、虚拟机配置如-XX:+UseCompressedClassPointers和-XX:+UseCompressedOops的影响,这些设置可以改变ClassPointer和引用类型的大小。对象总大小需为8的倍数,不足时会填充Padding。开启特定虚拟机选项时,对象可能占用32字节,否则可能占用48字节。
摘要由CSDN通过智能技术生成

对象的内存分布分为两种:
普通对象:

  1. 对象头/markword:记录对象的分代年龄、锁状态、hashcode/偏向锁的线程Id等
  2. ClassPointer指针:指向当前类的class对象
  3. 实例数据
  4. Padding对齐

数组对象(多了一个数组长度):

  1. 对象头/markword
  2. ClassPointer指针
  3. 数组长度
  4. 数组数据
  5. Padding对齐

对象大小与操作系统的位数有关(这里以64位机为例)

除操作系统位数外,还与虚拟机配置有关
查看虚拟机配置

java -XX:+PrintCommandLineFlags -version 

在这里插入图片描述
-XX:+UseCompressedClassPointers 对应 ClassPointer指针的大小,开启为4字节 不开启为8字节
-XX:+UseCompressedOops对应对象中引用类型属性的大小,开启为4字节 不开启为8字节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值