Java中没有sizeof运算符,所以无法知道一个对象占用了多少空间,但是在分配对象的时候有一些基本的规则,我们可以根据这些规则大致判断出对象的大小。对象头对象头至少有两个WORD,如果是数组,则三个WORD,内容如下:对象的HashCode,锁信息等,直到对象类型的指针数组长度data(如果是数组)规则首先,任何Object都是8字节对齐的,属性按照[long,double],[int,float],[char,short],[byte,boolean]的顺序存储,引用,例如:publicclassTest{bytea;intb;booleanc;longd;Objecte;}如果这个对象的属性是按顺序存放的,那么要占用的空间就是:head(8)+a(1)+padding(3)+b(4)+c(1)+padding(7)+d(8)+e(4)+padding(4)=40。但是根据这个规则:head(8)+d(8)+b(4)+a(1)+c(1)+padding(2)+e(4)+padding(4)=32,可见节省了不少空间。继承关系有一个基本规则:先存储父类的成员,再存储子类的成员,例如:classA{longa;intb;intc;}classBextendsA{longd;}这样存储顺序和占用空间如下:head(8)+a(8)+b(4)+c(4)+d(8)=32那么如果父类中的属性不够八怎么办字节?这样就有了新的规则:如果父类的最后一个成员和子类的第一个成员之间的间隔不够4个字节,就需要扩展到4个字节这个基本单位,例如例子:classA{bytea;}classBextendsA{byteb;}此时占用的空间为:head(8)+a(1)+padding(3)+b(1)+padding(3)=16。显然这种方法是浪费空间,所以就有了:如果子类的第一个成员是double或者long,而父类没有用完8个字节,JVM就会打破规则,将较小的数据填充到空间中,例如:classA{bytea;}classBextendsA{longb;shortc;byted;}此时占用的空间为:head(8)+a(1)+padding(3)+c(2)+d(1)+填充(1)+b(8)=24。
