剑指JVM:虚拟机实践与性能调优
上QQ阅读APP看书,第一时间看更新

3.1 程序计数器介绍

JVM中的程序计数器英文全称是Program Counter Register,其中Register的命名源于CPU的寄存器,寄存器用于存储指令相关的现场信息,CPU只有把数据装载到寄存器才能够运行。

程序计数器中的寄存器并非是广义上所指的物理寄存器,或许将其翻译为指令计数器会更加贴切(也称为程序钩子),并且也可以避免一些不必要的误会,为了使用习惯,本书还是使用程序计数器来表示Program Counter Register。JVM中的程序计数器是对物理寄存器的一种抽象模拟。

程序计数器是一块较小的内存空间,如图3-1所示,属于运行时数据区的一部分。它可以看作是当前线程所执行的字节码的行号指示器。在JVM的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器。分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成。

图3-1 程序计数器

如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地(Native)方法,这个计数器值则应为空(Undefined)。此内存区域是唯一一个在“Java虚拟机规范”中没有规定任何OutOfMemoryError情况的区域。程序计数器既没有垃圾回收也没有内存溢出。

程序计数器用来存储下一条指令的地址,也就是将要执行的指令代码。由执行引擎读取下一条指令,如图3-2所示,下一小节会通过举例来说明程序计数器的工作流程。

图3-2 线程中的程序计数器

程序计数器是一块很小的内存空间,几乎可以忽略不计。它也是运行速度最快的存储区域。在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。