正文
栈与栈帧
JVM 中由堆、栈、方法区(JDK 1.8 后改为元空间)组成,其中栈内存是给启动后的线程使用。
- 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
- 每个线程只能有一个活动栈帧,对应着当前正在执行的方法
代码
public class ThreadFrames {
public static void main(String[] args) {
test1(1);
}
private static void test1( int x){
int y = x +1;
Integer i = test2();
System.out.println(1);
}
private static Integer test2(){
Integer j = 15;
return j;
}
}
特点
栈内存管理非常简单,方法执行完毕就直接释放了,不用堆内存那么麻烦需要垃圾回收。
线程上下文切换(Thread Context Switch)
因为某些原因导致 CPU 不再执行当前线程,转而执行另一个线程的代码,如
- 线程CPU时间片用完
- 垃圾回收
- 更高优先级的线程需要运行
- 线程调用了 sleep、yield、wait、join、park、synchronized、lock 等方法
上下文切换时,需要操作系统保存当前线程的状态,并去回复到另一个线程的状态, Java 中对应的记录其状态的就是 程序计数器。
作用就是记住下一条 JVM 指令的执行地址,是线程私有的。
状态:包括程序计数器、虚拟机栈中每个栈帧的信息(局部变量表、操作数栈、返回地址等)
频繁上下文切换会影响性能
大白话 :你在打游戏(线程一 代码),突然你老妈说没酱油了,赶紧去买一瓶回来(线程二 代码),于是你很不情愿的把游戏存档(保存状态),跑去买酱油。
回来之后继续把刚刚存档的游戏,加载继续玩。
如果隔三差五让你中断游戏,一会打扫房间、一会拿快递,你觉得会不会影响你心态(性能)?