JAVA 入门到入土

19Chapter 一个对象的内存图2020-01-19

2020-01-19  本文已影响0人  琴匣自鸣

首先是,演示用的Phone类及调用Phone类的Demo类 

然后是内存示例图,图下方会写明内存执行流程

1.加载两个类的类文件,加载完成后两个类的信息会保存在方法区,注意成员方法在MA也是有内存地址的

2.代码执行,先执行Demo类内的Main方法 即 Main方法先入栈(也叫压栈)

3.在JVMS内划分出main方法用的内存空间,然后继续执行

4.Phone one = new Phone() 其中one标识符保存对象地址在Stack内 对象本身在Heap内,

5.创建对象时会根据在MA内的类信息或者说模板在堆内创建出相应的对象

6.Notice:刚创造出对象时,对象的属性值是对应类型的默认值,而且对象内的成员方法保存的实际是方法区内的成员方法所在的内存地址

7.当 one.brand="苹果" 执行时,先通过one保存的堆地址找到在堆里的对象,然后修改brand的值

8.当 one.call("乔布斯")时,先通过one保存的地址找到堆内对象,然后通过对象的成员方法call(注意这里的call也是一个引用量)保存的方法区地址找到真正的call方法,然后需要执行,那么将MA内的call()方法入栈然后执行,最终效果也就成了蓝色线的 one.call("乔布斯") 调用JVMS内的call(方法)

9.注意在call() 方法执行时,局部变量who也是引用类型String,存在方式不变也是栈内存地址,堆内存数据

10.当栈内call() 方法执行完成后,此时这块内存区域就已经不需要了那么执行出栈(也叫弹栈),栈内就将这部分清除了

11.然后执行sendMessage(),仍然是先找到st堆内存的对象,然后找到成员方法地址,根据地址找到方法区的方法本体,然后sendMessage()方法压栈在JVMS内划分内存区域执行,执行完后弹栈

12.当所有内容执行完后,Main()方法也执行完毕,最后Main()方法弹栈然程序结束

PS: 所谓压栈的叫法是因为,后入栈的的内存区域会压在之前入栈的区域上方

PS:所谓弹栈叫法是因为,改内存区域使用完后不再需要,JVMS会将该内存区域清除也叫弹出所以也叫弹栈

上一篇下一篇

猜你喜欢

热点阅读