2 程序计数器

2 程序计数器

2.1 定义

定义:program counter register 程序计数器(寄存器)

那我们通过一个例子来给大家解释程序计数器

首先明确这样一个概念,我们的二进制指令是不能直接给cpu执行的,还需要一个翻译官-解释器,把我们的二进制字节码解释为机器码,然后交给cpu去执行。

那说了上面这些跟我们要将的程序计数器有什么关系呢?

  • 程序计数器就是记住下一条jvm指令的执行地址,根据这个地址信息,我们就能找到这条指令来执行他。

假如我们正在执行第一条地址为0的getstatic ,然后我们会把下一条指令astore_1的地址3交给程序计数器,等你第一条指令执行完之后,解释器再去程序计数器里面取到下一条要执行的指令的地址3。根据地址3找到下一条指令astore_1。然后重复上面的过程。

在物理上,实现程序计数器是通过寄存器来实现的。程序计数器是java对物理硬件的一些屏蔽和抽象。那寄存器呢可以说是整个cpu组件里读取速度最快的一个单元,因为我们读取动作很频繁,所以java虚拟机在设计的时候就把寄存器当做程序计数器,用它来存取地址。

2.2 程序计数器的特点

  • 是线程私有的:我们知道呢,java程序是支持多线程并行运行的

假如我们有两个线程在执行,那我们知道cpu是分成时间片的执行的。那cpu在不断的做切换,我怎么知道我切换回来之后该执行哪一条指令。两个线程一个执行一会,比如我线程1正在执行地址为9的指令,然后到点了,线程1程序计数器会记住地址为10的指令地址。cpu跑去执行线程2的地址为5的代码,也到点了,然后线程2的程序计数器记住地址为6的指令地址。

  • 是唯一一个在java内存区中不会存在内存溢出的区

像堆啊,方法,栈啊,都会存在内存溢出。

原文地址:https://www.cnblogs.com/YXBLOGXYY/p/15332716.html