> 文档中心 > java中对象的内存模型

java中对象的内存模型

         java中当我们new一个对象时,当我们的class加载到内存中后,对象是什么样的?有那些部分组 成?每一部分是什么作用?

        不同的虚拟机实现不一样,这里只说下oracle官网的实现,这里以64位机器为例,那么一个普通对象在内存中一共有4个组成部分,如下图:

                     watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a-G5bqm5q-U5L6L,size_20,color_FFFFFF,t_70,g_se,x_16

        第一部分: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“这个值内存地址。

饲料网