详细分析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解释执行
- 堆区存放的是对象本身,是线程共享的区域
- 栈是线程方法执行过程的临时存储,是线程私有的区域
- 方法区存放类的静态属性,方法定义等信息
- 注意引用类型和基本类型作为局部变量的内存存储区别
- 引用通俗的理解,就是一小块内存指向了另外的一大块内存
- 形参其实就是局部变量