JVM之程序计数器

  • 时间:
  • 来源:互联网

冯·诺伊曼计算机体系结构的主要内容之一就是“程序预存储,计算机自动执行”,处理器要执行的程序(指令序列)都是以二进制代码序列方式预存储在计算机的存储器中,处理器将这些代码逐条地取到处理器中再译码、执行,以完成整个程序的执行。为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定下一条取址指令的地址,程序计数器正是起到这种作用,所以通常又称之为“指令计数器”。


程序计数器(Program Counter Register)是一块很小的内存空间,它是运行速度最快的存储区域,因为它位于不同于其他存储区的地方——处理器内部。寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。实际在JAVA应用程序内部你不能直接控制寄存器,也不能在程序中感觉到寄存器存在的任何迹象。我们可以把程序计数器看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器的工作就是通过改变程序计数器的值来选择下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖这个计数器来完成。


由于Java是支持多线程的语言,所以当线程数量超过CPU数量时,线程之间会自动根据时间片[1]轮询方式抢夺CPU资源。对于单核CPU而言,每一时刻只能有一个线程处于运行状态,其他线程必须被切换出去,直到轮询到自己才能使用CPU资源,为此,每一个线程都必须用一个独立的程序计数器,它被用来记录下一条需要执行的计算机指令。对于多核CPU来说,可以允许多个线程同时执行,各个线程之间的计数器互不影响、独立工作,所以程序计数器是线程独有的一块内存空间。如果当前线程正在执行一个Java方法,则程序计数器记录正在执行的Java字节码地址,如果当前线程正在执行一个Native方法,则程序计数器为空。根据Java虚拟机定义来看,程序寄存器区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。简单概括上面的描述,即在多线程环境下,为了让线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间互不影响、独立存储,因此这块内存是线程私有的。


JVM的架构是基于栈的,即程序指令的每一个操作都要经过入栈和出栈这样的组合型操作才能完成。JVM中的寄存器类似于物理寄存器的一种抽象模拟,正如前面说的,它是线程私有的,所以生命周期与线程的生命周期保持一致。



[1]      即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。



感兴趣的朋友可以关注麦克叔叔每晚10点说,让我们一起交流与学习。

本文链接http://element-ui.cn/news/show-576682.aspx