怎么计算一个对象占用的内存

本文详细探讨了如何计算一个对象在内存中占用的大小,包括对象头、实例数据、对齐填充三个部分,并讲解了基本数据类型及引用变量的内存占用。通过对不同例子的分析,阐述了计算过程中的注意事项,特别是对引用类型和对象实例的区分。
摘要由CSDN通过智能技术生成
怎么计算一个对象占用的内存

这应该是很多人在面试过程中遇到过的一个面试题~ 好多人在听到这么一个问题的时候都会瞬间懵逼,也有的人我记住了基本数据类型的占用内存和对象引用是4个字节大小。 这是正确的思考方向,但是不够全面。 下面就一步一步解析对象的组成有哪些。

对象分为三块存储区域

  1. 对象头(obect header)

对象头又包含两部分,总共占用大小12字节,如下: 对象标记(markOop)。存储对象在运行时的数据,如:哈希码、GC标记、锁信息、线程关联信息。在64位的jvm上占用 8个字节。需要补充一点的是,对象标记部分的存储格式是非固定的,具体要看jvm的实现。这样设计的目的是为了能存储 更多数据。

类元信息(klassOop)。存储对象指向的类元信息的首地址,也就是Klass的首地址。Klass存放在哪?在方法区。不知道 的可以去看看内存模型的介绍。类元信息占4个字节。

  1. 实例数据(Instance Data)

存储本类对象的实例成员变量和父类所有可见的成员变量

例子a:

public class BaseEntity {

    private int mId;

}
复制代码

BaseEntity类只有一个私有的成员变量,所以它new出来的对象占用(4+12)字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值