程序计数器概述
1、PC Register介绍
介绍:
-
PC寄存器是一块很小的内存空间,几乎可以忽略不计,也是运行速度最快的存储区域
-
在JVM规范中,每个线程都有自己的程序计数器(PC寄存器),是线程私有的,生命周期与线程的生命周期一致
-
任何时间一个线程都只有一个方法在执行,即所谓的
当前方法
。程序计数器会存储当前线程正在执行的java方法的JVM指令地址;如果是在执行native方法,则是存储未指定值(undefined)。(调用java方法是在虚拟机栈,本地native方法调用是在本地方法栈,因此是undefined) -
程序控制的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成
-
字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
-
程序计数器是唯一 一个没有OutOfMemoryError(OOM)的区域
作用:PC寄存器用来存储指向下一条指令的地址
,也就是将要执行的指令代码。执行引擎根据PC寄存器中存储的地址读取下一条指令
2、举例说明
public class PCRegisterTest {
public static void main(String[] args) {
int i = 10;
int j = 20;
int k = i + j;
String s = "abc";
System.out.println(i);
System.out.println(k);
}
}
反编译:javap -v PCRegisterTest.class
PC寄存器存储下一条将要执行的指令的地址
执行引擎将操作指令翻译成机器指令供CPU进行运算
3、两个常见问题
3.1为什么使用PC寄存器记录当前线程的执行地址呢
-
因为CPU需要不停的切换各个线程,这时候切换回来需要知道从哪里继续执行
-
JVM的字节码解释器需要通过改变PC寄存器中存储的地址来确定下一条应该执行什么样的字节码指令
3.2 PC寄存器为什么被设定为线程私有
在多线程并发执行时,CPU在某一时刻只会执行某一线程的方法,因此多线程并发执行是CPU在不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的方法就是为每一个线程都分配一个PC寄存器,这样各个线程便可以进行独立计算,线程之间互不干扰