今天突然在思考一个问题,jvm内存模型中的PC程序计数器和OS操作系统程序计数器有没有关系,是不是对应的,在网上查了些资料,弄懂了这个问题。
JVM程序计数器 VS OS程序计数器
一. 介绍
JVM程序计数器:
程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。- - 摘自《深入理解Java虚拟机》
OS程序计数器:
为了保证程序(在操作系统中理解为进程)能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用,所以通常又称为指令计数器。在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC,因此程序计数器(PC)的内容即是从内存提取的第一条指令的地址。当执行指令时,CPU将自动修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数,以便使其保持的总是将要执行的下一条指令的地址。由于大多数指令都是按顺序来执行的,所以修改的过程通常只是简单的对PC加1。 当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的地址,以此实现转移。有些机器中也称PC为指令指针IP(Instruction Pointer)
二. 特点
JVM程序计数器:
-
如果线程正在执行的是Java 方法,则这个计数器记录的是正在执行的虚拟机字节码指令地址
-
如果正在执行的是Native 方法,则这个技术器值为空(Undefined)
-
此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域
-
在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存
OS程序计数器:
- PC永远指向下一条待执行指令的内存地址(永远不会为Undefined),并且在程序开始执行前,将程序指令序列的起始地址,即程序的第一条指令所在的内存单元地址送入PC,
- CPU按照PC的指示从内存读取第一条指令(取指)。
- 当执行指令时,CPU自动地修改PC的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数(指令字节数),使PC总是指向下一条将要取指的指令地址。
- 由于大多数指令都是按顺序来执行的,所以修改PC的过程通常只是简单的对PC 加“指令字节数”。
- 当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的目标地址。
- 处理器总是按照PC指向,取指、译码、执行,以此实现了程序转移。
三.存储位置
JVM程序技术器:
线程独立的,JVM内存模型一块独立的存储区域,一般是CPU高速缓存中(L1~L3)
OS程序计数器:
OS线程的PC寄存器中。