1、PC Register介绍
JVM中的程序计数器(Program Counter Register)中,Register的命令源于CPIU的寄存器,寄存器存储指令相关的现场信息,CPU只有把数据源装载到寄存器才能运行。
这里,并非广义上所指的物理寄存器,获取将其翻译成为PC寄存器(或指令寄存器)会更加贴切,也可以称为(程序钩子)。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟
2、作用
PC寄存器用来存储指向下一条指令的地址,即将要执行的代码指令,由执行引擎读取下一条指令
- 他是一块很小的内存空间,几乎可以忽略不计,也是运行速度最快的存储区域。
- 在JVM规范中,每个县城都有他自己的程序计数器,是现成私有的,生命周期与线程的生命周期保持一致
- 任何时间一个县城都只有一个方法在运行,也就是所谓的当前方法,程序计数器会存储当前线程正在执行的java方法的JVM指令地址:或者,如果是正在执行的native方法,则是未指定值(undefined)
- 他是程序控制流的指示器,分之、循环、跳转、异常处理、线程恢复等基础功能都要依赖这个计数器完成
- 字节码解释器工作时就是通过改变这个计数器的值,来获取下一条需要执行的字节码指令。
- 他是唯一一个在Java虚拟机规范中没规定任何OOM情况的区域
3、举例说明
3、两个常见的问题:
使用PC寄存器存储字节码指令地址有什么用?
为什么使用PC寄存器记录当前县城的执行地址呢?
因为CPU需要不停的切换各个线程,这时切换回来以后,有了程序计数器,就知道接着从哪继续执行。
JVM的字节码解释器,就是通过改变PC寄存器的值,来确定下一条应该执行什么样的字节码指令
PC寄存器为什么会被设定为线程私有
我们都知道所谓的多线程在一个特定饿时间片中,智慧执行其中一个线程的某一个方法,CPU会不停的切换任务,这样必然会导致经常终端或恢复,如何保证指令的执行不出现差错呢?我们就需要一个可以准确记录各个线程正在执行的当前字节码指令地址的PC寄存器,最好的办法就是每个线程分配一个独有的PC寄存器,这样各个线程之间就能实现独立计算,不会出现互相干扰的情况。
由于CPU时间片轮询限制,众多线程在并发执行过程,任何一个确定的时间,一个处理器或者多核处理器中的一个内核,只会执行某个线程中的一条指令。
这样必然会导致经常终端或恢复,如何保证分毫不差呢?每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间互不影响。