一文理解JVM的程序计数器(PC)

article/2025/8/23 13:20:51

目录

1 功能演示

2 跳转、循环等执行的执行原理

3 关于PC的面试题


JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的信息。CPU只有把数据装载到寄存器才能够运行。但是这里并非是广义上所指的物理寄存器,在JVM中只是对PC寄存器的一种模拟,用来处理当前线程相关指令的计数器。

有一点与CPU的寄存器是类似的,那就是占用空间小,但运行速度最快。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,因此它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

在JVM规范中,每个线程都有它自己的程序计数器,而且是私有的,生命周期也与线程的生命周期一致。任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址。

需要注意的是PC区是唯一一个没有OutofMemoryError情况的区域。而本地栈等结构没有垃圾回收,但是有可能溢出。

本文我们将介绍PC计数器是如何工作的,如何表示跳转和循环等操作的,以及线程安全相关的问题。

 

1 功能演示

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

编译之后,执行javap -v PCRegisterTest.class,查看字节码,其中与PC有关的是:

public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=4, args_size=10: bipush        102: istore_13: bipush        205: istore_26: iload_17: iload_28: iadd9: istore_310: return

上面的竖排0 到10,就可以理解为PC计数器,而右侧的istore_1等就是操作指令,如下图。

 执行的时候如果PC发出的指令序号是5,那么这里就会执行存储操作,然后会执行操作局部变量表,操作数栈等等,最后还要再转换成机器指令给CPU来执行。

现在有个问题 ,PC计数器怎么知道要执行哪条指令的呢?PC计数器的值是谁来改的呢?修改PC值的是执行引擎。如下图所示。每执行一次,执行引擎就会修改该值来通知当前线程接下来要做什么工作。可以简单将PC理解为一个调度员。

2 跳转、循环等执行的执行原理

如果我们增加代码,会发现上面的Code下的指令会持续增加,对应的就是将每条语句都处理成了能够执行的指令。我们现在思考一个问题跳转、循环等功能,PC指令如何表示以及执行的呢?

先说结论:跳转还是循环是在字节码的指令里设置好的,PC计数器执行的时候不管这些,只关心接下来要执行哪一条指令。

我们先看一下跳转结构:

public class PCRegisterTest {
​public static void main(String[] args) {int i = 30;
​if (i < 30) {i++;} else {i--;}}
}   

我们通过javap -v来查看生成的PCRegisterTest.class文件的信息:

 可以看到,这里的指令6是一个比较指令

6: if_icmpge 15

表示的含义是,如果比较只会满足要求就继续向下执行,否则就跳转到指令15执行。

我们可以看到,如果满足条件继续执行,那就是iinc就是累加1指令。如果跳到指令15,那就是iinc指令执行累减1指令,因此与我们的代码设计是一致的。

我们再来看一下循环的情况:

public class PCRegisterTest {public static void main(String[] args) {int i = 30;int j = 40;for (i = 10; i < j; ) {int k = i + j;}}
}

在main()方法位置会看到如下信息:

 可以看到,生成的指令里,11号位置有个比较,如果满足才会继续向下走,如果不满足就会直接跳到21行。

我们注意到11行之下的正好是循环体的内容,而21行正好是退出。因此这里PC计数器仍然可以无脑向下走,不用关心是否为循环,只要知道下一个位置就可以了。

我们再看一下do while循环是否也这样:

public class PCRegisterTest {
​public static void main(String[] args) {int i = 30;do {i++;} while (i < 40);}
}

生成的指令如下:

 可以看到,指令9有个比较指令if_icmplt,如果满足就跳到指令3位置继续执行,否则就继续执行指令12。而指令3的位置正好就是累加操作i++,因此完美实现了循环。

3 关于PC的面试题

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

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

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

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


http://chatgpt.dhexx.cn/article/JZMfWB06.shtml

相关文章

程序计数器

一 程序计数器概念 程序计数器是一块较小的内存空间&#xff0c;它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里&#xff08;仅是概念模型&#xff0c;各种虚拟机可能会通过一些更高效的方式去实现&#xff09;1.字节码解释器工作时就是通过改变…

程序计数器的作用--简单易懂

3.程序计数器 什么是程序计数器&#xff0c;它是干什么用的&#xff1f; java中程序计数器是用寄存器实现的&#xff0c;它的作用是寻找下一个要执行的程序。 当我们的java程序被编译成二进制字节码文件后&#xff0c;如下图&#xff1a; 右面&#xff0c;是我们写的代码&…

程序计数器是什么(PC)?

在学习操作系统、JVM的时都可以看到程序计数器&#xff08;PC&#xff09;的身影&#xff0c;但是对于程序计数器的概念一直是模模糊糊&#xff0c;这篇就稍微讲一下什么是PC&#xff1f; 一、JVM层面 什么叫做“程序计数器”&#xff1f;它能做什么&#xff1f; 程序计数器…

什么叫做“程序计数器”?它能做什么?

什么叫做“程序计数器”&#xff1f;它能做什么&#xff1f; 程序计数器在JMM中的位置如下 是一个线程独享的数据区域&#xff0c;也就是说&#xff0c;每个线程之间的数据相互不干扰&#xff0c;是一个线程内存空间。 程序计数器 内存空间是不大的&#xff0c;第一眼看到这个…

简单谈谈对MVC设计模式的理解

MVC是Model-View-Controler的简称&#xff0c;即模型-视图-控制器。MVC是一种设计模式&#xff0c;它强制性的把应用程序的输入、处理和输出分开。 MVC中的模型、视图、控制器分担着不同的任务&#xff1a; 视图&#xff1a;视图是用户看到并能与之交互的界面。视图向用户显示…

前端MVC设计模式

http://www.cnblogs.com/jinguangguo/p/3534422.html 前言 前端的MVC&#xff0c;近几年一直很火&#xff0c;大家也都纷纷讨论着&#xff0c;于是乎&#xff0c;抽空总结一下这个知识点。看了些文章&#xff0c;结合实践略作总结并发表一下自己的看法。   最初接触MVC是后端…

Java Web开发中MVC设计模式简介

一、有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet&#xff0c;如何编写jsp及如何更新浏览器中显示的内容。但是我们之前自己编写的应用一般存在无条理性&#xff0c;对于一个小型的网站这样的编写没有任何问题&#xff0c;但是一但…

MVC设计模式及其工作原理

MVC模式介绍&#xff1a; MVC即模型Model、视图View、控制器Controller&#xff0c;用一种将业务逻辑、数据、视图分离的方式组织架构代码&#xff0c;通过分离关注点的方式来支持改进应用组织方式&#xff0c;其促成了业务数据Model从用户界面View中分离出来&#xff0c;还有…

android mvc设计模式

想在你的 Android 应用里优雅地分离出应用状态、用户交互和数据表现吗&#xff1f; 一个开发平台的设计者是的不会有闲工夫为你量身打造一个高层的应用架构的。但是你恰恰可以利用这一点&#xff0c;充分利用你的自由&#xff0c;根据应用需求和规模来实现你自己的架构。如果你…

mvc与mvvm设计模式

MVC与MVVM设计模式 一、MVC(Model- View-Controller) Model(模型)&#xff1a;负责保存应用数据、和后端交互同步应用数据&#xff0c;Model主要与业务数据有关、与应用内交互状态无关View(视图)&#xff1a;&#xff08;html、css&#xff09;负责构建和维护DOM元素&#xff…

MVC设计模式原理简述

开发MVC项目之前首先明确一点&#xff0c;MVC设计模式可以带来更好的软件结构和代码重用。 MVC如何工作 MVC是一个设计模式&#xff0c;它强制性的使应用程序的输入、处理和输出分开。使用MVC 应用程序被分成三个核心部件&#xff1a;模型、视图、控制器。它们各自处理自己的…

[Java]JavaWeb开发中的MVC设计模式

一、有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet&#xff0c;如何编写jsp及如何更新浏览器中显示的内容。但是我们之前自己编写的应用一般存在无条理性&#xff0c;对于一个小型的网站这样的编写没有任何问题&#xff0c;但是一但…

MVC设计模式及流程

MVC设计模式&#xff1a; 概述&#xff1a; 是一种开发结构合理、能使前后端分离、流程控制逻辑、业务逻辑调用与展示逻辑分离&#xff0c;实现高内聚&#xff0c;低耦合的设计模式。 M:数据实体模型(Model或Entity): 每一个类的成员变量字段对应数据库字段对应(对应的Entity…

SpringMVC(一)MVC设计模式

一、简介 MVC设计模式一般是指MVC框架&#xff0c;Model数据模型层&#xff0c;View视图层&#xff0c;Controller控制层。 使用MVC目的是将M和V实现代码分离&#xff0c;使统一程序有不同的表现形式。其中&#xff0c;View定义比较清晰&#xff0c;指用户界面。 web项目中&a…

MVC设计模式和UML类图

文章目录 一、UML 类图&#xff1a;二、MVC 设计模式 一、UML 类图&#xff1a; 14中UML图&#xff1a;https://blog.csdn.net/yoyo328/article/details/78009237 二、MVC 设计模式 MVC是常用的设计模式之一&#xff0c;将整个程序分为三个层次&#xff1a;视图模式层&…

JSP的MVC设计模式

文章目录 一. MVC模式概念1. M&#xff1a;Model&#xff08;模型&#xff09;2. V&#xff1a;View&#xff08;视图&#xff09;3. C&#xff1a;Controller&#xff08;控制器&#xff09;&#xff1a;4. 图示理解 二. MVC案例1. WebContent内容2. servlet包内容3. entity包…

MVC设计模式学习(一)

笔者对于MVC也是初学&#xff0c;写这篇文章的主要目的是方便自己去理解MVC的相关内容&#xff0c;所以有些描述并不是那么专业和全面&#xff0c;请多多包涵。 一、MVC设计模式概述 MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff…

MVC设计模式含义和优点

MVC模式&#xff08;Model-View-Controller&#xff09;是 软件工程 中的一种 软件架构 模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。 MVC模…

什么是MVC设计模式

直接上图&#xff0c;其中model 和view大家经常写&#xff0c;就不说了 有人可能并不清楚controller 到底是啥&#xff0c;其实就是经常写的 data source ,delegate,outlet什么的 先撇开那些乱七八糟的箭头单看他们之间的分界线&#xff0c;view与controller、model与controll…

MVC设计模式详解

MVC(Model View Controller)模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)&#xff1a; MVC本来是存在于Desktop程序中的&#xff0c;M是指数据模型&#xff0c;V是指用户界面&#xff0c;C则是控制器。使用MVC是将M和V的实现代码分离&#xff0c;从而使同…