Object obj = new Object();
是我们都会写的Java代码,但是你知道它执行之后,在不考虑对象引用所占空间的情况下,这个obj对象占用了多少内存空间吗?
这其实是一个面试必问的问题,与之类似的问题是“一个Java对象由几部分组成?”。答案是16字节,4或5个部分。那为什么是16字节呢?要回答这个问题,就要先搞清楚Java对象的结构。
一个Java对象由4部分组成,分别是markword
(对象运行时的数据),klass指针
(指向该类的元数据,用来说明这个对象属于哪个类),instance data
(对象的各种字段内容),padding
(占位符),数组还要多一个组成部分是数组长度
。其中markword和klass指针,还有数组长度合称对象头。在64位JVM开启指针压缩的情况下,markword占8字节,klass指针占4字节,数组长度占8字节,由于JVM规定对象的起始地址必须是8字节的整数倍,所以padding起占位符的作用,将对象的长度填充到8字节的整数倍,是可以有也可以没有的。
综上所述,Object obj = new Object()申请出来的obj对象占用16个字节:8字节的markword,4字节的klass指针,没有instance data,加起来12字节,所以还有4字节的padding。如果不开启指针压缩,klass指针就是8个字节,该对象也是16个字节。
图1是Java对象的结构图,图2是数组的结构图,两者的不同在于数组多一个长度为8位的数组长度属性。
注:静态属性不计算在对象大小中。