首页 > 编程语言 >程序计数器

程序计数器

时间:2023-12-16 10:44:26浏览次数:36  
标签:字节 程序 PC 计数器 指令 线程 寄存器

一、概述

程序计数器 (Program Counter Register) 是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器,在 Java 虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器;分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成
由于 Java 虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都会执行一条线程中的指令,因此为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为线程私有的内存
如果线程正在执行的是一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地(Native)方法,这个计数器的值则应为空(Undefined),此内存区域是唯一一个在 <<Java 虚拟机规范>> 中没有规定任何 OutOfMemoryError 情况的区域

二、示例

public class PCRegisterDemo {
    public static void main(String[] args) {
        int i = 10;
        int j = i++ + ++i;
        System.out.println(i);
        System.out.println(j);
    }
}

通过 javap -verbose PCRegister.class 命令进行反解析,下面这些标红的数字就是字节码指令的指示器,通过改变 PC 寄存器的值来选取下一条将要执行的字节码指令

注意: javap 命令并不是反编译,因为 .class 文件本身是一些二进制的字节流,只不过通过 javap 命令解析之后,将这些二进制的流转变成了我们能够看得懂的新衣而已

三、总结

PC 寄存器的作用是什么

PC 寄存器是当前线程所执行的字节码的行号指示器,通过改变 PC 寄存器的值可以用来选取下一条将要执行的字节码指令

为什么设置成线程私有

多线程环境下,某个线程如果要进行 CPU 切换,就必须先保存当前的运行环境,等重新获取 CPU 执行权的时候,又要恢复到切换前的环境,这个时候就需要有一个地方记录这个线程切换前,程序执行到了哪个位置,恢复时就从这个位置开始往后执行就可以,如果 PC 寄存器是所有线程共享的,那么就无法正确恢复切换前的运行环境

PC 寄存器为什么不会有 OutOfMemoryError 发生

PC 寄存器存放的是下一条将要执行的字节码指令的地址,Java 虚拟机规范中肯定定义了一条指令地址的最大长度是多少,只要将 PC 寄存器的容量设置成 >= 字节码指令地址的最大长度,就永远不会有 OutOfMemoryError 发生

 

标签:字节,程序,PC,计数器,指令,线程,寄存器
From: https://www.cnblogs.com/xiaomaomao/p/17904579.html

相关文章

  • 读程序员的README笔记12_On-Call
    1. 行为准则2. On-Call工程师2.1. On-Call工程师是应对计划外工作的第一道防线,无论是生产环境问题还是临时支持请求2.2. 将深度工作与运维工作分开,可以让团队中的大多数人专注于开发任务2.3. On-Call工程师只需专注于不可预知的运维难题和支持任务3. On-Call的工作方......
  • Android程序员如何避免职业瓶颈,实现个人职业价值最大化?
    前言随着科技的不断发展,互联网行业日新月异,年轻一代的安卓开发者层出不穷。但对于已经步入中年的安卓开发者来说,面临的职业发展困境和竞争压力也开始逐渐显现。越来越多的程序员难以跟上时代的步伐,只会埋头写代码,缺乏大局观和长远的职业考虑。缺乏大局观的程序员许多程序员缺乏大局......
  • 限制Android程序员发展的不是年龄,而是这个.....
    前言在互联网圈有个默认的35岁定律:做互联网技术的,一旦年龄来到35岁,如果不能转到公司的管理岗位,还在基层默默地写程序,改bug,那么离被离职就不远了。同样,这两年网上大量的裁员信息层出不穷,不少大龄程序员都在这被淘汰。那么,我们今天一起来思考一下限制程序员发展的到底是什么?是年龄?为......
  • 2023-2024-1 20231405《计算机基础与程序设计》第十二周学习总结
    2023-2024-120231405《计算机基础与程序设计》第十二周学习总结作业信息作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP作业要求在哪里https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13009作业的目标自学......
  • 【Linux】调试常见的应用程序奔溃“Segmentation fault (core dumped)”
    https://blog.csdn.net/hello_nofail/article/details/129994481?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170264661316800227454508%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=170264661316800227454508&......
  • 读后感:《程序员修炼之道》第七部分 - 代码质量
    第七部分的《程序员修炼之道》深入讨论了如何提高代码质量和可维护性。这一部分提供了一系列关于代码审查、重构、设计模式和测试的宝贵建议。以下是我从这一部分中得到的主要启示:首先,书中明确强调了避免坏味道(代码异味)的重要性。坏味道是代码中的不良实践和设计问题的迹象。通过......
  • 2023-2024-1 20231406 《计算机基础与程序设计》第十二周学习总结
    2023-2024-120231406《计算机基础与程序设计》第十二周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十二周作业这个作业的目标自学《C语言程序设计》第11章并完成云班课测试......
  • 广州小程序定制开发价格多少钱?
    随着移动互联网的快速发展,小程序在各行各业中的应用也变得越来越广泛。企业和个人常常面临的问题之一就是小程序的定制费用。广州小程序定制开发费用因项目的规模、功能需求、设计复杂度等因素而有所不同,本文将讨论一些影响小程序定制价格的关键因素。1.项目规模和功能需求小程序......
  • 设计模式:程序员的秘密武器(高手必备)
    在过去的几十年的职业生涯中,我观察到许多同事在技术方面取得了显著的进步和能力提升。然而,随着时间的推移,他们似乎逐渐遇到了一个发展的瓶颈。尽管大家都渴望以最快的速度提升自己的技能水平,但他们忽视了一个关键的因素,那就是内功修炼。是的,我相信大家都知道我们所说的内功心法指......
  • 设计模式:程序员的秘密武器(高手必备)
    在过去的几十年的职业生涯中,我观察到许多同事在技术方面取得了显著的进步和能力提升。然而,随着时间的推移,他们似乎逐渐遇到了一个发展的瓶颈。尽管大家都渴望以最快的速度提升自己的技能水平,但他们忽视了一个关键的因素,那就是内功修炼。是的,我相信大家都知道我们所说的内功心法指......