PC寄存器概念
- 每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器。PC寄存器用来存储指向下一条指令的地址,也即,将要执行的指令的代码,又执行引擎来读取下一条指令。 每一个线程都有它自己的PC寄存器,也是该线程启动时创建的,是线程私有的,就是一个指针。
- 是一个非常小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。也是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
- 这块内存区域很小,它是当前线程所执行的字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。
- 如果执行的是一个Native方法,那这个计数器是空的。
使用PC寄存器有什么用呢?为什么要使用PC寄存器记录当前线程的执行地址呢?
因为在程序的实际执行过程中,CPU需要不停地切换各个线程,这时候切换回来以后,就得知道接着从哪里开始继续执行。
JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令。
PC寄存器为什么会被设定为线程私有?
多线程在一个特定的时间段内指挥执行其中某一个线程的方法,CPU会不停地做任务切换,这必然会导致经常中断或者恢复(CPU时间片轮换机制,宏观上我们可以打开多个应用程序同时运行,但在微观上单核情况下由于只有一个CPU,一次只能处理程序要求的一部分),如何保存现场呢?为了能够准确地记录各个线程正在执行地当前字节码指令地址,最好地办法自然是为每个线程都分配一个PC寄存器,这样一来各线程之间便可以进行独立计算,从而不会出现相互干扰的情况。
这里涉及到并行和并发的概念区别,可以参考这个博客来看https://blog.csdn.net/qq_41026809/article/details/90485634