JVM虚拟机运行时数据区
想要真正了解各个区执行程序时究竟发生了什么,我们还是从代码开始
public class Main {
public static void main(String[] args) {
Main main = new Main();
main.compute();
}
private int compute() {
int a = 1;
int b = 2;
int c = (a + b)*10;
return c;
}
}
准备阶段:
- 通过javac命令把Main.java编译成字节码文件Main.class
- 通过类装载子系统把字节码文件装在到方法区
运行阶段:
-
先执行main()方法,在栈上开辟一块栈帧.(这个栈就是数据结构中的栈,先进后出)
-
然后执行局部变量
Main main = new Main();
-
再执行
main.compute()
;
-
然后执行compute()方法,在栈区开辟一块栈帧
-
然后执行
int a= 1;
- 将int类型常量1压入栈
- 将int类型值存入局部变量表1;
- 将int类型常量1压入栈
-
同理,第二个
int b = 2
同理
-
第三个
int c = (a+b)*10;
取出a,b相加,再乘以10,放入局部表量表
-
执行完之后return,通过方法出口,返回到main()方法中的调用那一行,compute()-栈帧出栈;
-
main()执行完之后,main()-栈帧出栈
-
然后堆区的main对象没有被引用了,会被gc掉
-
线程结束后,程序结束.