运行时数据区-程序计数器(PC寄存器)
概括
The Java Virtual Machine can support many threads of execution at once (JLS §17). Each Java Virtual Machine thread has its own pc (program counter) register. At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method (§2.6) for that thread. If that method is not native, the pc register contains the address of the Java Virtual Machine instruction currently being executed. If the method currently being executed by the thread is native, the value of the Java Virtual Machine's pc register is undefined. The Java Virtual Machine's pc register is wide enough to hold a returnAddress or a native pointer on the specific platform.
- 它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。
- 在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。
- 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JM指令地址;或者,如果是在执行native方法,则是未指定值(undefned) 。
- 它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
- 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
- 它是唯一一个在Java 虚拟机规范中没有规定任何outOtMemoryError情况的区域。
作用
Pc寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。
问题
- 使用PC寄存器存储字节码指令地址有什么用呢?
因为cpu会不断的切换各个线程,切换回来后需要知道从哪开始继续执行。 - 为什么使用PC寄存器记录当前线程的执行地址呢?
jvm的字节码解释器需要通过改变PC寄存器的值来确定执行什么字节码指令 - PC寄存器为什么被设定为线程私有?
CPU在运行中会不断的切换,为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个Pc寄存器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互千扰的情况。
CPU时间片
CPU时间片即cPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片。

浙公网安备 33010602011771号