JVM模型简图
运行时数据区
上图中绿色部分详细图
程序计数寄存器(Program Counter Register)
作用
PC寄存器用来存储指向下一条指令的地址,即将要执行的指令代码,由执行引擎读取下一条指令。
- 它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖PC寄存器来完成
- 字节码解释器工作时就是通过改变这个PC寄存器的值来选取下一条需要执行的指令
- PC寄存器与本地方法栈、方法区、堆区、线程JVM栈不同,其没有OutOtMemoryError(内存溢出)
概述
Register源于CPU的寄存器,寄存器储存指令相关的信息,CPU只有把数据装在到寄存器才能运行。
而JVM中的寄存器概念并非广义上所指的物理寄存器,JVM的PC寄存器是对物理PC寄存器的的一种抽象模拟。
PC寄存器是一块很小的内存空间,几乎可以忽略不计,也是运行速度最快的存储区。
JVM中每个线程都有它自己的PC寄存器,即线程私有的,生命周期与线程的生命周期一致。
任何时间,一个线程都只会有一个方法在执行,即当前方法,PC寄存器会存储正在执行的Java方法的JVM指令地址。如果是执行的是native方法,则是未指定值(undefind,即PC寄存器不储存本地方法的执行指令,native方法会有对应的本地方法栈)
使用javap -v xxx.class命令查看字节码文件:
PC寄存器就是用来存储指令地址,执行引擎可以通过PC寄存器中当前的指令地址,翻译成机器指令,交由CPU处理:
- 由于CPU是有时间片的,并不是一直在处理某些任务,会在线程间来回的切换,切来切去的过程中,CPU需要知道从哪里开始继续执行。JVM的字节码解释器就要通过改变PC寄存器中指令地址来明确下一条执行的指令是什么。
- 同上述解释可以得出,PC寄存器是每个线程私有一个的,PC寄存器是不可以多线程共享的