一、基本介绍
1.1 概念
JVM 中的程序计数寄存器(Program Counter Register)中,Register 的命名原语 CPU 的寄存器,寄存器存储指令相关的现场信息,CPU 只有把数据加载到寄存器中才能运行。
JVM 中的寄存器并非广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子)。JVM 中的 PC 寄存器(软件层面)是对物理 PC 寄存器的一种抽象模拟。
1.2 性质
- 程序计数器是一块很小的内存空间,几乎可以忽略不计。也是运行速度最快的存储区域。
- 线程私有,生命周期与线程的生命周期保持一致。
- 任何时刻一个线程只能有一个方法在执行,也就是当前方法。程序计数器会存储当前线程正在执行的 java 方法的 JVM 指令地址;或者如果是执行 native 方法,则是未指定值(undefined)。
- 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
- 它是唯一一个在 Java 虚拟机规范中没有规定任何OOM(补充:也没GC)情况的区域。
二、作用
PC寄存器用来存储指向下一条指令的地址,即,即将要执行的指令代码。由执行引擎读取下一条指令。
使用举例
- PC 寄存器中存放下一条指令的地址。
- 执行引擎读取 PC 寄存器中指令地址,接着获取到下一条操作指令,然后将操作指令翻译为 CPU 可执行的机器指令。作根据指令操作局部变量表、操作数栈。
两个常见问题
PC寄存器存储字节码指令地址的作用是什么?
因此CPU需要不停的切换线程,切换回来以后,需要知道接着从哪开始继续执行。
PC寄存器为什么被设定为线程私有?
CPU需要不停的切换线程,为了能够准确记录各个线程正在执行当前字节码指令地址,最好的方法就是为每一个线程准确地记录各个线程正在执行的当前字节码指令地址。