程序计数器(PC Register)
这里的计数器(Program Counter Register)并非为广义上所指的物理寄存器,JVM中的PC寄存器(程序计数器)是对物理PC寄存器的一种抽象模拟,相当于IDE中的光标索引值,行号,表示当前正在编辑的行号。
PC寄存器用来存储指向下一条指令的地址,也就是即将执行的指令代码,由执行引擎读取下一条指令,特点:
- 它是一块很小的内存空间,几乎可以忽略不记,他也是运行速度最快的存储区域。
- 在JVM规范中,每个线程都有自己的程序计数器,是线程私有的,生命周期与线程周期保持一致。
- 任何时间一个线程都只有一个方法在执行,也就是所说的当前方法,程序计数器会存储当前线程正在执行的Java方法的JVM指令地址。或者,如果是在执行native方法,则是未指定值(undefined)
- 他是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都是需要依赖这个计数器来完成。
- 字节码解释器工作时就是通过更改这个计数器的值来选取下一条需要执行的字节码指令。
- 他是唯一一个在Java虚拟机规范中没有任何OutOfMomeryError (OOM)情况的区域。
- 其实就是相当于一个索引。
常见问题:
Q:使用PC寄存器存储字节码指令地址有什么用?
A:因为CPU需要不停的切换各个线程,当切换回来的时候,需要知道从哪里接着执行。JVM的字节码解释器就需要通过更改PC寄存器的值来说明下一条应该执行什么样的字节码指令。
Q:PC寄存器为什么会被设置为线程私有?
A:因为CPU在进行执行程序的时候,是并发执行,即虽然有多个线程同时执行,但是CPU在一个特定的时间段内只会执行其中某一个线程的方法,即CPU在不停的切换任务,这样便会产生中断和恢复,为了能够准确记录各个线程正在执行的当前字节码指令地址,最好的办法就是为每一个线程都分配一个PC寄存器,这样便能够每个线程之间独立的运行而不会出现干扰。
Q:并行、串行、并发的比较?
- 并行:同时执行
- 串行:一个接一个执行,一次执行完毕执行下一个
- 并发:不断的切换,同时执行,但是每次只有一个在执行