栈与栈帧
我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。
- 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
通过 IDEA 的 Debug 工具可以看到栈帧:
线程的上下文切换
因为以下一些原因导致 CPU 不再执行当前的线程,转而执行另一个线程的代码
- 线程的 CPU 时间片用完
- 垃圾回收
- 有更高优先级的线程需要运行
- 线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方法
线程上下文切换的时候,通过程序计数器来保存当前线程的状态,并回复另一个线程的状态
线程上下文切换的频繁发生会影响性能
Java 线程的几种状态
操作系统定义的线程有五种状态,但 Java Thread 类中以枚举的方式定义了六种状态。
- NEW:初始状态
- RUNNABLE:运行状态
- TERMINATED:终止状态
- WAITING:等待状态,例如等待其他线程唤醒
- TIMED_WAITING:等待状态,有倒计时的都等待
- BLOCKED:获取锁阻塞
情况 1 NEW --> RUNNABLE
- 当调用 t.start() 方法时,由 NEW --> RUNNABLE
情况 2 RUNNABLE <--> WAITING