内存分析01

1.main()的栈帧先出现,args没有字段,所以是null。然后轮到【Person p1 = new Person();】语句,先在栈中产生Person的栈帧,然后在堆中产生对象。当执行【Person p1 = new Person();】时方法区中调用了Person类的方法,堆于方法区产生了对象,name:null;age=0;show则是来自调用方法区。Person的栈帧将堆中0x11的地址赋值给了main()栈帧里的p1,然后Person的栈帧就消失。

2.执行【p1.age = 24; 】后,堆中的age得到数值24;执行【p1.name = "张三"; 】时,因为“张三”是一段字符串,不是基本数据类型,java中是一个不可变的类,从方法区调用"张   三“的地址给堆中的name;执行到【p1.show();】时栈产生一个新的栈帧p1.show栈帧。方法区已调用show方法信息,所以p1.show直接用方法区的show方法信息执行【System.out.println("姓名:"+this.name+",年龄:"+this.age);】当中this是指使用show方法的p1(0x11),不加this的话系统也是默认this。在执行完show方法后,p1.show栈帧就消失。

 3在执行【Person p2 = new Person();】时,栈也是先生成一个Person的栈帧,然后new了一个新的对象于堆里,地址先定于0x12,由于还没赋值,所以name=null;age=0,在方法区中调用show方法信息。(... ...)main中p2由Person获得地址0x12,Person消失。

 

4执行【

        p2.age = 35;

        p2.name = "李四";        

        p2.show();

】时堆中的对象name从方法区中获得”李四“的地址,age赋值成35,方法区调用show方法信息,栈生成一个新的p2.show()的栈帧,调用show方法执行语句后,得到结果。p2.show()的栈帧消失,然后main()的栈帧消失,堆的对象消失。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值