JVM中的程序计数寄存器PC是什么详解

目录
  • 一、PC寄存器概述
    • 简单介绍
  • 二、PC寄存器的作用
  • 三、PC寄存器举例说明
  • 四、解决PC寄存器常问到的两个面试问题
    • 1、使用PC寄存器存储字节码指令地址有什么用呢?
    • 2、PC寄存器为什么会被设定为线程私有的,一个线程一份?
  • 五、CPU时间片

一、PC寄存器概述

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

简单介绍

1、 PC寄存器是一块很小的内存空间,几乎可以忽略不计,也是运行速度最快的存储区域。

2、 在JVM规范中,每个线程都有它自己的PC寄存器,是线程私有的,生命周期与线程的生命周期保持一致。

3、 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法,PC寄存器会存储当前线程的正在执行的Java方法的JVM指令地址;或者,如果是执行的native方法,则是未指定值。

4、 PC寄存器是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个寄存器来完成。

5、 字节码解释器工作时就是通过改变这个寄存器的值来选取下一条需要执行的字节码指令。

6、 PC寄存器是唯一 一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

注:方法区(元数据区)和堆区是有GC(垃圾回收)的,而栈区和PC寄存器是没有的;栈区、方法区、堆区是有OOM(OutOfMemoryError)的,而PC寄存器没有。

二、PC寄存器的作用

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

每一个栈帧就相当于存储了一个方法,栈帧中的每一个指令都有一个标识,这里PC寄存器就存储了指令的地址,起标识作用,然后执行引擎就根据这个标识来读取到下一条指令。

三、PC寄存器举例说明

public class PcRegisterTest {
    public static void main(String[] args) {
        int i = 10;
        int j = 5;
        int k = i+j;
    }
}

这里我们运行编译下这段代码,然后在进入到out对应的目录下执行javap命令:

我们就可以看到反编译的一个结果:

上图红色框里的数字就是指令地址或者偏移地址,其就是PC寄存器里面存储的地址。蓝色框里的就是操作指令。然后执行引擎就根据这个指令地址取出指定的操作指令来操作虚拟机栈(局部变量表、操作数表),并且翻译成机器指令,让CPU对相应的计算。

四、解决PC寄存器常问到的两个面试问题

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

(为什么使用PC寄存器记录当前线程的执行地址呢?)

因为CPU需要不停的切换各个线程,这时候切换回来后,就得知道是从哪个指令开始继续执行。JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码按指令。

2、PC寄存器为什么会被设定为线程私有的,一个线程一份?

我们都知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?

1.为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。

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

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

五、CPU时间片

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

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

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

总的来说,我们用一句话来概括:宏观并行,微观并发。

简单图示:

PC寄存器就到这里以上就是JVM中的程序计数寄存器PC原理分析的详细内容,更多关于JVM程序计数寄存器PC原理的资料请关注我们其它相关文章!

(0)

相关推荐

  • JVM内存结构:程序计数器、虚拟机栈、本地方法栈

    目录 一.JVM 入门介绍 JVM 定义 JVM 优势 JVM JRE JDK的比较 学习步骤 二.内存结构 整体架构 1.程序计数器(寄存器) 1.1 作用 1.2 特点 2.虚拟机栈 2.1 定义 2.2 演示 2.3 面试问题辨析 2.4 内存溢出 2.5 线程运行诊断 3.本地方法栈 4.总结 一.JVM 入门介绍 JVM 定义 Java Virtual Machine,JAVA程序的运行环境(JAVA二进制字节码的运行环境) JVM 优势 一次编写,到处运行 自动内存管理,垃圾回收机制

  • Java中的程序计数器是什么

    程序计数器是当前线程正在执行的字节码的地址.程序计数器是线程隔离的,每一个线程在工作的时候都有一个独立的计数器. JAVA虚拟机管理的内存区域图 1.什么是程序计数器? 程序计数器是当前线程正在执行的字节码的地址.程序计数器是线程隔离的,每一个线程在工作的时候都有一个独立的计数器. 2.字节码的执行原理 编译后的字节码在没有经过JIT(实时编译器)编译前,是通过字节码解释器进行解释执行.其执行原理为:字节码解释器读取内存中的字节码,按照顺序读取字节码指令,读取一个指令就将其翻译成固定的操作,根据

  • Java JVM运行时数据区(Run-Time Data Areas)

    1.官网概括 引用官网说法: The Java Virtual Machine defines various run-time data areas that are used during execution of a program. Some of these data areas are created on Java Virtual Machine start-up and are destroyed only when the Java Virtual Machine exits.

  • 深入解析java虚拟机

    java虚拟机是什么 "java虚拟机"可能指以下三种东西:1).抽象规范:2).一个具体的实现:3).一个运行中的虚拟机实例: java虚拟机生命周期 启动当启动一个java程序时,一个虚拟机实例诞生.虚拟机实例通过调用某个初始类的public static void main(String[] args)方法来运行一个java程序.任何拥有这样一个main方法的类都可以作为java程序运行的起点,所以必须要告诉虚拟机初始类的名称,整个程序将从它的main方法开始运行.消亡初始类的m

  • JVM中的程序计数寄存器PC是什么详解

    目录 一.PC寄存器概述 简单介绍 二.PC寄存器的作用 三.PC寄存器举例说明 四.解决PC寄存器常问到的两个面试问题 1.使用PC寄存器存储字节码指令地址有什么用呢? 2.PC寄存器为什么会被设定为线程私有的,一个线程一份? 五.CPU时间片 一.PC寄存器概述 CPU只有把数据装载到寄存器才能够运行.这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会.JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟

  • java中JVM中如何存取数据和相关信息详解

    前言: 我们每天都在编写Java代码,编译,执行.很多人已经知道Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行. 那在整个程序执行过程中,JVM中怎么存取数据和相关信息呢? 事实上在JVM中是用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存. 一.运行时数据区域包括

  • 解读在C#中winform程序响应键盘事件的详解

    在winform程序中给form添加了keyup事件,但是程序却不响应键盘事件,解决办法是重写Form基类的ProcessCmdKey(ref Message msg, Keys keyData)方法. 复制代码 代码如下: protected override bool ProcessCmdKey(ref Message msg, Keys keyData)        {            if (keyData == Keys.F4)            {            

  • 如何在程序中判断VS的版本(实现方法详解)

    代码如下所示: #include<iostream> using namespace std; int main() { cout << _MSC_VER << endl; return 0; } 在VC6.0中结果为:1200 在VC10.0(VS2010)中结果为:1600 _MSC_VER实际就是 Microsoft visual c++ version(是微软的预定义宏). 具体对应如下: MS VC++ 14.0 _MSC_VER = 1900(VS2015)

  • 在Spring Boot应用程序中使用Apache Kafka的方法步骤详解

    第1步:生成我们的项目: Spring Initializr来生成我们的项目.我们的项目将提供Spring MVC / Web支持和Apache Kafka支持. 第2步:发布/读取Kafka主题中的消息: <b>public</b> <b>class</b> User { <b>private</b> String name; <b>private</b> <b>int</b> age

  • 微信小程序中的列表切换功能实例代码详解

    感觉这列表切换有点类似于轮播图,而且感觉这代码直接可以拿来用,稍微改一改样式什么的就OK了,列表切换也是用到的地方也很多 wxml中的代码如下: <!-- 标签页面标题 --> <view class="tab"> <view class="tab-item {{tab==0?'active':''}}" bindtap="changeItem" data-item="0">音乐推荐<

  • 微信小程序 本地数据存储实例详解

    微信小程序 本地数据存储实例详解 前言 如果您在看此文章之前有过其他程序的开发经验,那一定会知道一般例如安卓或者苹果的原生APP都提供了本地的存储功能,甚至可以使用sqlite数据库来做存储.可是微信的小程序框架基于微信本身,其实际运行环境只是在浏览器里面,所以不会提供那么丰富的数据存储实力.但html5开始已经可以在浏览器里面存储数据,好在微信的小程序给这个功能封装好了,这样我们可以使用数据存储. 每个微信小程序都可以有自己的本地缓存,可以通过 wx.setStorage(wx.setStor

  • python程序调用远程服务的步骤详解

    前言 项目是基于python3的PC桌面项目.因为需要对外发布web服务进行数据交换所以需要支持web服务.项目主要使用了GET,POST服务请求. 一.python3中怎样进行发送web请求? python3使用urllib模块实现web请求,可以支持Get和Post请求. 二.使用步骤 1.引入python库 import http.client import urllib,parser urlPre = '127.0.0.1' 2.GET服务 def getToRemote(url): c

  • 网络安全渗透测试小程序抓包流程步骤详解

    目录 小程序测试流程 搜索目标小程序 小程序主体信息确认 小程序包获取 PC端 windows端获取小程序包流程 移动端 解包 调试 抓包 小程序测试流程 分为两个方面,解包可以挖掘信息泄露问题.隐藏的接口,抓包可以测试一些逻辑漏洞.API安全问题.两者结合起来就可以边调试边进行测试,更方便于安全测试. 搜索目标小程序 目标搜索不能仅仅局限于主体单位,支撑单位.供应商.全资子公司等都可能是入口点,所以小程序当然也不能放过它们. 小程序主体信息确认 查看小程序账号主体信息,否则打偏了花费了时间不说

  • Windows和夜神模拟器上抓包程序mitmproxy的安装使用详解

    目录 windows 一.介绍说明 二.安装以及配置 三.mitmdump的使用 夜神模拟器 一.安装过程 1.准备 2.安装命令,在.mitmproxy目录下运行cmd 3.重命名+推送至手机 4.安装mitm证书到手机adb shell操作: 5.查看是否成功: ** windows ** 一.介绍说明 mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler.Charles的功能,只不过它是一个控制台的形式操作. mitmproxy还有两个关联组件.一个是mitmd

随机推荐