本博文中所讨论的JVM只是自己看书和教程的个人理解,不太严谨,严谨需要另找详细的资料,对细节把控很到位。
本博文环境:
System OS: Windows10 1909
JDK-Version: 1.8.0_202
JVM: Java HotSpot™ 64-Bit Server VM (build 25.202-b08, mixed mode)
IDE: IDEA2021.3
一,前言
针对于内容JVM运行时数据区概述和总结对JVM中运行时数据区进行了一个整体的介绍,本博文是对运行时数据区中的程序计数器进行剖析和详解。
二,PC寄存器说明
首先看看官方虚拟机规范的说明:
JVM中的程序计数器(Program Counter Register
)中,Register
的命名来源于CPU的寄存器,我们知道寄存器存储指令相关的现场信息。CPU只有把数据转载到寄存器中才能运行。
这里的PC寄存器不是我们实际的物理电脑上的一个寄存器,他是虚拟机对物理机器中的一个模拟实现。可以理解为是JAVA程序在运行过程中的一个“钩子”,用来保存程序执行过程中的上下条指令。JVM中的寄存器是对物理寄存器的一个模拟实现。
按照文章JVM运行时数据区概述和总结中所概述的,PC 寄存器
是线程所私有的。
作用主要是用来存储指令的下一条指令的地址(将要执行的指令代码)。由执行引擎按照PC寄存器中的地址内容信息进行读取到下一条指令。
如上图所示,在当前线程中(当前正在执行的线程),PC寄存器指向下一条要执行的地址。在运行时数据区的整个架构中,是一块非常小的内存区域,可以小到几乎忽略不记(只是存放地址而已)。是运行速度最快的存储区域。,并注意任何时间一个线程只有一个方法在执行,也就是所谓的当前方法,程序计数器中的地址存储的就是当前线程正在执行的JAVA方法的JVM指令地址。但是,如果执行的是Native方法
,则是没有指定的值(undefined
)。
在JVM虚拟机规范中说明,每一个线程都有他自己的程序计数器
,是线程私有的。生命周期和线程保持一致,执行结束之后,PC寄存器就没有存在的价值了。
三,问题
- 为什么要使用PC寄存器记录当前线程的执行地址?
1.CPU需要不停的切换各个线程,线程切换回以后,需要知道自己接着从哪里继续执行。
2.JVM的字节码解释器需要通过改变程序计数器的值来明确下一条应该执行什么样的字节码指令。 - PC寄存器为什么回被设定为线程私有?
为了能够准确的记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器,这样各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。
参考:
https://blog.csdn.net/W_317/article/details/108859860
https://blog.csdn.net/u013528298/article/details/106306028
《深入理解JAVA虚拟机第三版》
代码是最为耐心、最能忍耐和最令人愉快的伙伴,在任何艰难困苦的时刻,它都不会抛弃你