程序计数器
# 程序计数器
程序计数寄存器(Program Counter Register),Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的线程信息,CPU 只有把数据装载到寄存器才能够运行。
这里,并非是广义上所指的物理寄存器,叫程序计数器(或PC计数器或指令计数器)会更加贴切,并且也不容易引起一些不必要的误会。JVM 中的 PC 寄存器是对物理 PC 寄存器的一种抽象模拟。
程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。
# 一.概述
- 它是一块很小的内存空间,几乎可以忽略不计。也是运行最快的存储区域。
- 在JVM规范中,每个线程都有自己的程序计数器,是线程私有。生命周期与线程的生命周期保持一致
- 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行java方法的JVM指令地址。 如果正在执行的是本地(Native)方法,这个计数器值则应为空(Undefined)
- 此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域
# 二.作用
PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。

pc寄存器存储栈帧中当前方法的指令地址,并由执行引擎读取。
# 三.实际操作查看
使用javap- v查看后可知,这些数字就是所说的指令地址,而后面那些就是操作指令。 我们拿指令地址 5 来说,存储在了PC寄存器中而执行引擎去PC寄存器去取。得到相应的操作指令。

# 四.总结
- 用PC寄存器存储字节码指令有何用处?
《深入理解虚拟机》书中提到: 由于Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一 个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因 此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器
- PC寄存器为何需要线程私有?
寄存器存储的是java栈中当前方法(当前栈帧)内的一系列指令地址。如果不是线程私有,比如第一个线程记录了指令地址6 cpu分配到第二个线程执行到了 8。那当再回到第一个线程时 指令地址已经是8了,导致一系列问题。线程私有就在于保证每个线程中寄存器存储 的指令地址不被更改,即使不在当前线程,回来的时候还是接着存储的指令地址继续执行。
编辑 (opens new window)
上次更新: 2023/01/05, 06:33:52