简单的介绍一下相关原理。
栈和栈帧
每个栈是由多个栈帧(Frame
)组成,对应着每次方法调用时所占用的内存。
每个线程只能有一个活动栈帧,对应着当前正在执行的的那个方法。
图中,一共有 3
个方法。
- 可以看到三个方法,分别对应 3 个
Frame
test1
有两个语句,但是,也只有 1 个Frame
- 如果
test2
执行完毕,返回后,那么,左侧的Frame
也只剩下两个,即执行完之后,Frame
就被释放了 - 另外,注意图中的进入方式,是栈的方式
多线程
将 debug
模式调为 Thread
模式,然后,图中是,将 t1
线程 debug
到图中位置。
从图上可以得出的结论是
- 多线程的栈帧都是独立的
线程的上下文切换 context switch
以下原因导致 cpu
不能执行当前的线程,转而执行另一个线程的代码
- 线程的
cpu
时间片用完 - 垃圾回收
- 有更高级的线程需要运行
- 线程自己调用了
sleep
、yield
、wait
、join
、park
、synchronized
、lock
等方法
当 context switch
发生时。需要由操作系统保存当前线程的状态,并恢复另一个线程的状态。Java
对应的概念是程序计数器(Program Counter Register
),它的作用是记住下一条 jvm
的执行地址,是线程私有的。
状态包括
- 程序计数器
- 虚拟机栈中的每个栈帧的信息
- 局部变量、操作数栈、返回地址等