详细分析java的执行过程和内存空间分布

目的:

  • 理解一段代码的执行过程,和它的内存分布

  • 通过内存分布,加深对静态成员变量,和局部变量的理解

  • 通过堆区和栈区的分析,可以更好的理解多线程执行问题

一,java执行过程分析:

1.和c语言作对比

  • c语言代码,源文件是.c;编译生成的文件是.obj;连接后就是可执行文件.exe,.exe文件执行,是直接由windows操作系统操作执行
  • c代码是编译型语言,编译后的文件和操作系统类型息息相关,如果换到其他操作系统,需要重新改代码,编译。不能跨平台。(执行时是编译好一下执行,不是一行一行的解释执行,所以效率高)

2. java语言的特点

  • .java文件,是被编译成一种字节码文件,由JVM解释执行(它作为中间层,和不同操作系统打交道)。效果是跨平台,一次编译,可处处运行。(属于半编译半解释,混合型语言)
  • java代码执行过程和内存的分布图
    在这里插入图片描述

二,java的内存分布过程

1,main方法执行

栈帧中是main方法的局部变量,三个引用类型一个基本数据类型
在这里插入图片描述

2,方法change1的执行内存分布

i是形参,是局部变量,是值传递,初始值是9,是date的值传进来的。
在这里插入图片描述
执行到i=1234时,局部变量i存的是1234. 注意main中dade的值没有变,还是9. 因为它只是把值9copy了给i。
在这里插入图片描述
change1执行完之后,它的局部变量i消失,不在内存中了
在这里插入图片描述

3,方法change2的执行过程

d1是实参,同时它也是引用类型,它传给形参b的值内容是一个对象的地址,结果是d1和b都代表了同一个对象。
在这里插入图片描述
方法change2中,b变成指向另一个新的对象。注意d1的对象内容没有改变
在这里插入图片描述
changge2执行结束后,局部变量b消失,b指向的那个堆中对象也会消失(没有b引用它了,变成了垃圾对象,由垃圾回收器清理掉它)
在这里插入图片描述

4,方法change3的执行过程

它和change2类似也是引用类型的参数传递,b和d2指向同一个对象。
执行完后,对象的属性值被改变。
在这里插入图片描述

三,总结

  • java的执行过程是先编译成jvm可识别的字节码,然后由jvm解释执行
  • 堆区存放的是对象本身,是线程共享的区域
  • 栈是线程方法执行过程的临时存储,是线程私有的区域
  • 方法区存放类的静态属性,方法定义等信息
  • 注意引用类型和基本类型作为局部变量的内存存储区别
  • 引用通俗的理解,就是一小块内存指向了另外的一大块内存
  • 形参其实就是局部变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值