PC Register介绍
JVM中的程序计数器(Program Counter Register),Resgiter 的命名原于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。
这里,并非是广义所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序的钩子)。JVM的PC寄存器是对物理寄存器的一种抽象模拟
作用:PC寄存器是用来存储下一条指令的地址,也就是即将执行的指令代码,由执行引擎读取下一条。
·程序计数器是一个以线程私有的一块较小的内存空间,用于记录所属线程所执行的字节码的行号指示器
·是一块很小的很存空间,几乎可以忽略不计。也是运行速度最快的一块存储区域
·在JVM规范中,每个线程都有他自己的程序计数器,生命周期与线程一致。
·任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法程序计数器会存储当前线程正在执行的Java方法的JVM指令地址;或者,如果执行native方法,则是未指定值(undefine)
·他是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成
·字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
·他是一个唯一在Java虚拟机规范中没有规定任何OutMemoryError情况的区域(既没有GC,也没有OOM(Out'OfMemory);方法区和堆有GC,也有OOM,虚拟机栈和本地方发栈没有GC,但是有OOM)
举例说明
常见问题
Q:使用程序计数器存储字节码指令地址有什么用(为什么使用PC计数器记录当前的线程执行地址)
A:因为CPU要不停切换各个线程,这时候切换回来以后,就得知道从哪继续开始执行;JVM的字节码解释器就要通过改变PC寄存器的值明确下一条应该执行什么样的字节码指令。
Q:PC寄存器为什么设定成线程私有的
A:假如多个线程公用一份,那么当我CPU切换到另一个线程时,PC寄存器保存的是线程1的下一条字节码指令数字,在CPU从线程二切换到其他线程是,PC寄存器里边的值就要存线程2的线程状态,当CPU再次切换到1线程,就找不到该从哪里执行,所以要线程私有。
CPU时间片:
CPU时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片。
在宏观上我们可以打开多个运行程序,每个程序并行不悖,同时运行
但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,引入时间片从而让程序轮流执行