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

  • Post author:
  • Post category:其他


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

这应该是很多人在面试过程中遇到过的一个面试题~ 好多人在听到这么一个问题的时候都会瞬间懵逼,也有的人我记住了基本数据类型的占用内存和对象引用是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)字节。