黑马视频讲解地址:https://www.bilibili.com/video/BV16J411h7Rd?p=21
示例
结合代码分析线程运行的原理。 代码如下,很简单就是main方法中调用m1方法,m1方法再调用m2方法。
public class Test01 {
public static void main(String[] args) {
m1(10);
}
public static void m1(int x){
int y = x + 1;
Object m = m2();
System.out.println(m);
}
public static Object m2(){
return new Object();
}
}
分析
分析涉及到JVM相关知识:JVM之内存模型
首先执行main方法后,JVM会为main方法创建一个栈帧放到运行时数据区的栈中,栈帧中存放了局部变量表、操作栈、动态链接、方法出口等信息,创建栈帧时局部变量也会开辟好内存空间。
首次加载时他会将java文件加载成字节码放在方法区中等待程序计数器的调用。 创建好栈帧之后接下来就是在程序计数器中执行main方法中对应的代码,也就是执行m1方法。此时发现有新的方法要执行时JVM会创建m1方法的栈帧,然后再执行m1方法中的代码,执行m1中涉及局部变量,他是存在栈中的,实际会指向堆中的对象。
m1中执行到m2方法时同理会创建一个栈帧执行m2中的方法,m2执行完之后会创建一个Object返回到m1的中执行的代码行中。同时最顶上的m2栈帧会退出栈接着执行m1栈帧中的代码依次类推指导main栈帧执行结束,线程运行结束。
总结
通过对线程运行原理的学习,总结如下。
- java中方法的执行会对应着每个线程私有栈中的栈帧,栈帧中存放了局部变量表、操作栈、动态链接、方法出口等信息。
- 每个方法结束之后,对应的栈帧在虚拟栈中删除释放空间。接着执行下一个栈顶中的栈帧的代码,这就是为什么虚拟栈要叫栈的原因,方法的执行遵循先进后结束原则(先进后出)。
- 栈是线程私有的,这样方便在线程发生切换时私有的程序计数器记录保存当前执行的状态,方便线程下一次被唤醒执行时恢复执行。
|