面试官:new Object() 占用多少个字节?--20211028

大家好,我是指北君。

最近指北君在搞面试,然后感觉面试官有点不讲武德。

指北君:面试官,你好,开始面试吧。

面试官:好的,那我们现在开始,你对JVM有了解吗?

指北君:JVM知道一些,你指的是哪一块内容?

面试官:JVM内存结构熟悉吧,new Object() 占用多少个字节? 指北君心想,面试官不讲武德啊,问这样一个问题。我的好好算算,先给他讲讲JVM内存结构吧。

指北君:在JVM中,一个Java Object 主要由 对象头,对象中实际的数据以及对齐填充组成。

image-20211023202429192

指北君:对象头分为 MarkWord 和 Class Pointer 两部分。

  • MarkWord: 包含一系列的标记位,比如轻量级锁的标记位,偏向锁标记位, gc记录信息等等,在系统中占8字节。
  • ClassPointer: 用来指向对象对应的Class对象(其对应的元数据对象)的内存地址。在系统中占8字节。如果开启压缩的话,占用4个字节。

指北君:Interface data ,对象实际数据,对象实际数据包括了对象的所有成员变量,其大小由各个成员变量的大小决定。

指北君:对象对齐,Java对象占用空间一般都是8个字节做对齐,字符补充的。即所有Java对象占用空间bytes数必须是8的倍数, 是因为当我们从磁盘中取一个数据时, 都是按照8个字节的大小来获取数据的,所以当初设计的时候,为了能够取到完整的对象,padding的作用就是补充字节数,保证对象是8字节的整数倍。

面试官:嗯, 你这说的是Java 对象的内存结构,那new Object到底是多少呢?

指北君:这个已经很明显了,不管我们开不开启对象指针压缩都是16个字节。因为 MarkWord 占用8个字节,Class Pointer 未压缩的时候是8个 字节,压缩完就是4个字节。Object中没有任何对象属性之类的,所以就没有内容。对象方法是放在堆中,所以也不需要包含,对象对齐的话,在对象指针未压缩的时候无需补齐,在对象指针开启压缩的时候,需要补齐4个字节。

面试官:嗯,那如果是一个数组对象呢?对象内存结构有啥变化吗?

指北君:数组对象的话,在内存结构中,对象头的部分,还有个length,表示数组的长度,其他的部分是一致的。

面试官:嗯,今天先面到这吧。 你还有什么问题吗?

指北君:我这个Offer稳吗?

面试官:下次再面……

总结

今天我们主要是通过模拟面试的场景,通过new Object() 学习了Java对象的内存结构。

Java Geek Tech wechat
欢迎订阅 Java 技术指北,这里分享关于 Java 的一切。