怎么计算一个对象占用的内存
这应该是很多人在面试过程中遇到过的一个面试题~ 好多人在听到这么一个问题的时候都会瞬间懵逼,也有的人我记住了基本数据类型的占用内存和对象引用是4个字节大小。 这是正确的思考方向,但是不够全面。 下面就一步一步解析对象的组成有哪些。
对象分为三块存储区域
- 对象头(obect header)
对象头又包含两部分,总共占用大小12字节,如下: 对象标记(markOop)。存储对象在运行时的数据,如:哈希码、GC标记、锁信息、线程关联信息。在64位的jvm上占用 8个字节。需要补充一点的是,对象标记部分的存储格式是非固定的,具体要看jvm的实现。这样设计的目的是为了能存储 更多数据。
类元信息(klassOop)。存储对象指向的类元信息的首地址,也就是Klass的首地址。Klass存放在哪?在方法区。不知道 的可以去看看内存模型的介绍。类元信息占4个字节。
- 实例数据(Instance Data)
存储本类对象的实例成员变量和父类所有可见的成员变量
例子a:
public class BaseEntity {
private int mId;
}
复制代码
BaseEntity类只有一个私有的成员变量,所以它new出来的对象占用(4+12)字节。