java中对象的内存模型
java中当我们new一个对象时,当我们的class加载到内存中后,对象是什么样的?有那些部分组 成?每一部分是什么作用?
不同的虚拟机实现不一样,这里只说下oracle官网的实现,这里以64位机器为例,那么一个普通对象在内存中一共有4个组成部分,如下图:
第一部分:markword,长度为8个字节,主要存放的是GC相关信息(是否有被引用),hashcode信息,还有锁信息(是否加锁)
第二部分:class pointer(类型指针), -xx: + UseCompressedClassPointers 设置占用4个字节不开启占8字节,主要是指向对象所属的class,比如:一个Class A,当我们 A a=new A() 时,这个a对象的类型指针会指向A.class。
第三部分: instance data(实例数据), 存放的是对象的成员变量,如代码示例里的 i、j、str都是对象a的成员变量。
第四部分:padding(对齐),字节补齐,也就是当对象的前三部分加起来字节数不能被8整除时,需要补齐字节数,能够整除8.在下面的代码实例中,markword 8个字节+类型指针 4个字节+i占用4个字节+j占用8个字节+str的4个字节=28,这时候就需要补齐padding部分需要补上4个字节,这样就是32个字节,也就是a对象32个字节。
代码示例:
public class A { private int i; private long j; private String str="admin test"; public static void main(String [] args){ A a=new A(); } }
另外,如果是数组对象的话,在上边4部分基础上多了一部分,第五部分:数组的长度,占4个字节。
备注:在字节对齐部分,成员变量 str 是一个引用,所以是4个字节, str存的是指向”admin test“这个值内存地址。