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

目的:

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

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

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

一,java执行过程分析:

1.和c语言作对比

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

2. java语言的特点

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

二,java的内存分布过程

1,main方法执行

栈帧中是main方法的局部变量,三个引用类型一个基本数据类型
详细分析java的执行过程和内存空间分布

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

i是形参,是局部变量,是值传递,初始值是9,是date的值传进来的。
详细分析java的执行过程和内存空间分布
执行到i=1234时,局部变量i存的是1234. 注意main中dade的值没有变,还是9. 因为它只是把值9copy了给i。
详细分析java的执行过程和内存空间分布
change1执行完之后,它的局部变量i消失,不在内存中了
详细分析java的执行过程和内存空间分布

3,方法change2的执行过程

d1是实参,同时它也是引用类型,它传给形参b的值内容是一个对象的地址,结果是d1和b都代表了同一个对象。
详细分析java的执行过程和内存空间分布
方法change2中,b变成指向另一个新的对象。注意d1的对象内容没有改变
详细分析java的执行过程和内存空间分布
changge2执行结束后,局部变量b消失,b指向的那个堆中对象也会消失(没有b引用它了,变成了垃圾对象,由垃圾回收器清理掉它)
详细分析java的执行过程和内存空间分布

4,方法change3的执行过程

它和change2类似也是引用类型的参数传递,b和d2指向同一个对象。
执行完后,对象的属性值被改变。
详细分析java的执行过程和内存空间分布

三,总结

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