02_程序计数寄存器

image-20200911110925570

JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够进行逻辑计算(ALU)。

这里,并非是广义上所指的物理寄存器,它仅仅是JVM中对于物理PC寄存器的一种抽象模拟。它是JVM定义的一个数据结构,用来存储指向JVM方法中下一条JVM指令的地址(索引),也就是可以获取到即将要执行的指令代码,由执行引擎读取下一条指令。

它是一块独立的很小的内存空间,即不属于栈(虚拟机栈和本地方法栈)也不属于堆,几乎可以忽略不记,这块内存和线程绑定。也是运行速度最快的存储区域。

在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的声明周期保持一致。

任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址;如果是在执行native方法,则是未指定值(undefined)。(所以个人猜测对于用户方法的实现就是在一个统一的通用的native方法中加载用户方法中所有jvm指令到一个列表,然后模拟CPU指令按指令进行实际的C/C++代码操作即可)

它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

它是唯一一个在Java虚拟机规范中没有规定任何OutofMemoryError情况的区域。

image-20200911111453664

示例

image-20200911113000991

image-20200911113116621

为什么要有PC寄存器

因为CPU需要不停地切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。

JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令。


   转载规则


《02_程序计数寄存器》 阿钟 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录