程序计数器

介绍

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

这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。

它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。

在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。

任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址;或者,如果是在执行native方法,则是未指定值(undefned)。可以理解为行号指示器。

它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

它是唯一一个在Java虚拟机规范中没有规定任何outotMemoryError情况的区域。

作用

PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。


注意:后续我们主要关注GC和OOM(outotMemory)。对于GC,只有堆区和方法区存在GC机制;对于OOM,只有PC寄存器不存在OOM。因此,只有PC寄存器既不需要GC机制,也不会出现OOM。

代码演示

我们首先写一个简单的代码

/**程序计数器 */
public class PCRegisterTest {public static void main(String[] args) {int i = 10;int j = 20;int k = i + j;}
}

然后将代码进行编译成字节码文件,我们再次查看 ,发现在字节码的左边有一个行号标识,它其实就是指令地址,用于指向当前执行到哪里。

0: bipush        10
2: istore_1
3: bipush        20
5: istore_2
6: iload_1
7: iload_2
8: iadd
9: istore_3
10: return

通过PC寄存器,我们就可以知道当前程序执行到哪一步了

使用PC寄存器存储字节码指令地址有什么用呢?

因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。

JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令。

PC寄存器为什么被设定为私有的?

我们都知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。

由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或者多核处理器中的一个内核,只会执行某个线程中的一条指令。

这样必然导致经常中断或恢复,如何保证分毫无差呢?每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间互不影响。

CPU时间片

CPU时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片。

在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。

但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。


注意:

  • 并行 VS 串行
  • 并发

并发(concurrent)指的是多个程序可以同时运行的现象,更细化的是多进程可以同时运行或者多指令可以同时运行。但这不是重点,在描述并发的时候也不会去扣这种字眼是否精确,并发的重点在于它是一种现象。并发描述的是多进程同时运行的现象。但实际上,对于单核心CPU来说,同一时刻只能运行一个进程。所以,这里的"同时运行"表示的不是真的同一时刻有多个进程运行的现象,这是并行的概念,而是提供一种功能让用户看来多个程序同时运行起来了,但实际上这些程序中的进程不是一直霸占CPU的,而是执行一会停一会。

所以,并发和并行的区别就很明显了。它们虽然都说是"多个进程同时运行",但是它们的"同时"不是一个概念。并行的"同时"是同一时刻可以多个进程在运行(处于running),并发的"同时"是经过上下文快速切换,使得看上去多个进程同时都在运行的现象,是一种OS欺骗用户的现象。

04-程序计数器(PC计数器)相关推荐

  1. jvm内存区域之虚拟机栈、pc计数器、本地方法栈

    1.pc计数器 程序计数器的作用是什么? 字节码解释器通过改变程序计数器中存储的下一条字节码指令地址以此来达到流程控制 Java多线程的线程会切换,为了保存线程切换前的正确执行位置,每个线程都应该有程 ...

  2. Java #JVM(HotSpot) 运行时数据区 #程序计数器(PC寄存器)#虚拟机栈(栈帧:局部变量表、操作数栈……)#堆……

    目录 JVM中线程的说明 程序计数器(PC寄存器) 虚拟机栈 · 栈帧 ·· 局部变量表 ·· 操作数栈 ·· 动态链接 ·· 方法返回地址 ·· 本地方法栈 堆 · 查看堆的大小 · 堆的默认大小 ...

  3. 程序计数器(pc寄存器)

    程序计数器(PC寄存器 Program Counter Register) pc寄存器并非广义上所指的物理寄存器,JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟 作用:PC寄存器用来存储指向下一 ...

  4. 1507_FUSA_单片机的安全测试有哪些常见的测试项以及CPU寄存器测试和PC计数器测试的简介

    全部学习汇总: GitHub - GreyZhang/g_FUSA: some learning notes about function safety. Inlcude both ISO26262 ...

  5. java pc计数器_java虚拟机-程序计数器PC Register

    什么是程序计数器? 程序计数器是一块 较小 的内存空间,它可以看做是当前线程所执行的字节码的 行号指示器 :在虚拟机的概念模型里(仅仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解 ...

  6. java虚拟机-程序计数器PC Register

    什么是程序计数器? 程序计数器是一块 较小 的内存空间,它可以看做是当前线程所执行的字节码的 行号指示器 :在虚拟机的概念模型里(仅仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解 ...

  7. ARM三个寄存器 : 堆栈指针SP(R13)、连接寄存器LR(R14)和程序计数器PC(R15)

    深入理解ARM的这三个寄存器,对编程以及操作系统的移植都是必要的. 1.堆栈指针R13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模式( ...

  8. Ubuntu20.04下 PC机对Locobot机器人的ROS远程通讯

    写在最前面:   最近参加了机器人导航的项目,前前后后配了好几次的ROS远程通讯,在这里把步骤.遇到的问题.教程什么的都汇总一下.   先明确我们要做的事情--实现在我们自己的PC机(之后简称Moni ...

  9. ARM指针寄存器——堆栈指针寄存器SP、程序计数器PC、连接寄存器LR

    参考:堆栈指针寄存器 SP详解以及栈的作用 作者:蓝色鲜橙多 网址:https://blog.csdn.net/qq_36588941/article/details/89873633?utm_sou ...

最新文章

  1. 多传感器融合之滤波(一)——卡尔曼滤波(KF)推导
  2. 用 Python 详解《英雄联盟》游戏取胜的重要因素!
  3. 【OpenCV 4开发详解】图像极坐标变换
  4. 用shell脚本实现MongoDB数据库自动备份
  5. arp miss攻击_网络应用华为S9300核心交换机ARP安全配置
  6. virtualBox虚拟机安装UBuntu系统问题及处理
  7. GitHub使用入门讲解--官方文档翻译让你最真实了解
  8. 超级简单的自动刷新_Excel动态透视表,刷新即可更新内容,简单方便 #职场 #办公技巧...
  9. 【代码笔记】iOS-竖状图
  10. 商品管理系统(可用于学生参考)
  11. SpringCloud_03_Feign入门示例
  12. 产品经理必修课(4):深挖需求
  13. 中企海外周报 | 哈弗F7x性能版在俄罗斯上市;徐工首家海外银行落户巴西
  14. 极客时间左耳听风-高效学习
  15. RK3288 7.1 lt8911b MIPI转EDP
  16. 交通管理PDA手持机
  17. BTree与B+Tree图文详解
  18. 台湾国立大学郭彦甫Matlab教程笔记(5)structured programming
  19. Python爬取全国大学排名 用pyecharts进行大屏可视化
  20. 环氧(Epoxide)官能化载玻片(生物芯片)

热门文章

  1. 某人一定不会的——重口味线段树
  2. tomcat 部署脚本
  3. IE6中png背景图片透明的最好处理方法
  4. JSON 之 SuperObject(6): 方法
  5. css flex排序居中
  6. 关于 python 的注释
  7. docker添加阿里云专属镜像
  8. 原生js的ajax请求
  9. 【winfrom】读写文本
  10. 【uoj#139】[UER #4]被删除的黑白树 贪心