1个对象的内存图

java对象头内存对齐_成员变量



图中包含栈内存、堆内存和方法区


方法区中包含class文件内容,分成两块,一块是PhoneDemo.class另一块是Phone.class


其中Phone.class中包含成员变量和成员方法

PhoneDemo.class中包含一个main方法


1.加载main方法到栈内存中


2.Phone p = new Phone();


在栈内存中创建一个Phone类型的引用对象 p ;

在堆内存中创建一个Phone对象,同时在堆内存中创建Phone对象的成员变量:brand(默认null),price(默认0),color(默认null)

让引用对象p指向Phone对象(引用对象p持有了堆内存中Phone对象的一个地址值)


注:方法区中,Phone.class的方法在堆内存中Phone对象中也持有这些方法的引用,以便于在执行Phone对象的方法的时候快速定位并执行


3.System.out.println(p.brand+” “+p.price+” “+p.color);

打印对象的初始化值:null 0 null


4.p.brand=”三星”

p.price=3999

p.color=”白色”


给堆内存中Phone对象进行赋值,赋值之后该对象的成员变量变成了:brand:”三星”,price:3999,color:”白色”


5.System.out.println(p.brand+” “+p.price+” “+p.color);


打印:”三星” 3999 “白色”


6.p.call(“乔布斯”)

首先在方法区中找到call方法,然后加载到栈内存中,执行call()方法,执行完毕之后,从栈内存空间中消失

p.sendMessage()、p.playGame() 方法同上,也是先加载到栈内存,执行完毕之后从栈内存中消失

2个对象的内存图

java对象头内存对齐_栈内存_02



这里牵涉到方法的共用

在堆内存中new出的两个对象在调用方法的时候,因为方法的内容是不变的,所以两个对象调用的方法也是相同的,由堆内存指向方法区的方法引用来间接调用Phone类的方法

3个对象的内存图

java对象头内存对齐_成员变量_03



其中有两个引用指向同一个对象


就是p3所引用的对象和p1引用的对象在堆内存中是同一个对象

通过p3改变成员变量的值,也就等同于使用p1改变了这个对象成员变量的值