一、设计目的
在Java的字节码解析器当中,需要辨别当前的字节码解析到了哪个地方,同时需要来控制程序的流程,如果在程序当中没有一个东西来记录当前程序执行到哪个,同时下一步应该执行哪一步操作例如:分支、循环、跳转、异常处理等操作都不是按照原本程序书写的顺序来执行的,所以为了能够引导程序的运行,就需要引进一个用来引导字节码解析顺序的东西,就叫做程序计数器。
二、设计模型
并没有多少资料记录了程序计数器的设计原理,但是在一些资料的描述当中
程序计数器是一块较小的内存空间,它可以看作是单个线程所执行的字节码的行号指示器。在虚拟机的概念模型当中,字节码解释器工作时就是通过改变这个计数器的值来选择下一条需要执行的字节码指令
得出第一个结论:这个计数器存在的方式是以一种数据结构的形式放置于内存当中,因为它的改变需要字节解释器来改变其值而没有封装成熟的方法。
第二:如果将模型扩大化,程序计数器应该是固定程序私有的,它不属于系统资源,因为需要保证程序的正常运行,而不能被其它程序干扰,所以它应该被分配一个唯一的标识被程序本身记住,而不是在内存中创建之后让计数器记住程序的唯一标识,这一点可以在以下资料中得到证明
为了线程切换后能够恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不印象
第三:在这个模型当中,它的大小应该是确定的,因为它用来记录下一个指令的位置。
三、模型逻辑
1、如果线程正在执行的是一个java方法,那么计数器记录的是正在执行的虚拟机字节码指令地址
2、如果执行的native方法,计数器当中的内容应当是空
3、此内存区域在java的虚拟机规范当中是唯一一个没有规定OutOfMemoryError的区域