1.PC寄存器
- 存储指向下一条指令的地址,由执行引擎根据PC寄存器读取下一条指令。下图中一个栈帧相当于一个方法,假设当前栈帧的局部变量表地址为1,操作数栈为2,PC寄存器就是存储该地址:
- 它是很小的内存空间,也是运行速度最快的存储区域
- 因为每个线程都有自己的PC寄存器,所以它的生命周期和线程的一致
- 任何时间一个线程只能有一个方法在执行(即当前方法)。PC寄存器会存储当前方法的JVM指令地址;如果是执行本地方法,则为未指定值(因为PC寄存器是Java层面的寄存器)
- 它是程序控制流的指示器,比如循环、线程恢复等都依赖它
- 字节码解释器工作时通过改变它的值来选取下一条需要执行的字节码指令
tips:
- 寄存器存储指令相关的现场信息,CPU只有把数据装载到寄存器才能运行
- JVM的PC寄存器是对物理PC寄存器的抽象模拟
- PC寄存器是唯一在JVM中没有GC和OOM的(虚拟机栈或本地方法栈没有GC但有可能溢出,方法区和堆也可能溢出)
2.举例说明
- 假设Java程序代码如下:
public static void main(String[] args) { int i = 10; int j = 20; int k = i + j; }
将其进行反编译后:
3.常见问题
使用PC寄存器存储字节码指令地址的作用?
JVM字节码解释器需要通过改变PC寄存器的值明确下一条该执行什么字节码指令
为什么使用PC寄存器记录当前线程的执行地址?
因为CPU需要不停的切换线程,切换回来后需要知道从哪里继续执行
PC寄存器为什么被设定为线程私有?
因为CPU会不停在多个线程中做任务切换,为了能够准确记录各个线程正在执行的当前字节码指令地址,所以为每个线程分配一个PC寄存器,这样每个线程可以独立计算,避免线程间相互干扰的情况