[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register)

这篇具有很好参考价值的文章主要介绍了[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

  1. JVM中的程序计数器(Program Counter Register)是对物理PC寄存器的一种抽象模拟。
  2. 它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。
  3. 在 JVM 规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。
  4. 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行 native 方法(本地方法),则是未指定值(undefined)。
  5. 它是唯一一个在Java虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域,因为它存储的是一个可预见大小的值。

[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register),JVM,jvm

 

二、作用

        程序寄存器(Program Counter Register)用来存储 下一条指令的地址,由执行引擎来读取下一条指令并执行。

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

例如这段代码:

[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register),JVM,jvm

我们对这段代码进行编译,的到PCRegisterTest.class,然后执行javap命令进行反编译。

[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register),JVM,jvm

我们查看这段代码:

[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register),JVM,jvm

左边一列0、2、3等是指令的偏移地址,右边的bipush 10等就是指令。

简单理解地址为0、地址为2的两个指令的意义是:把10压栈到1的位置。 

整体理解如下图:

[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register),JVM,jvm

 提前理解一下栈帧,一个栈帧可以理解为一个方法。

[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register),JVM,jvm

 三、常见问题

1. 使用PC寄存器存储字节码指令地址有什么用呢? 或者是 为什么使用 PC 寄存器来记录当前线程的执行地址呢?

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

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

  • 我们都知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。
  • 由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或者多核处理器中的一个内核,只会执行某个线程中的一条指令。
  • 这样必然导致经常中断或恢复,如何保证分毫无差呢?每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间互不影响。
  • 在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间互不影响。


 

参考:

3. 运行时数据区及程序计数器 · 语雀

百度安全验证

JVM运行时数据区_仅此而已_的博客-CSDN博客

JVM程序计数器_android jvm 程序计数器_轩*的博客-CSDN博客

JVM-第4章-程序计数器(Program Counter Register)_program priority register_小成同学_的博客-CSDN博客

为什么JVM规范中,程序计数器不会发生OutOfMemoryError_纵有疾风起 人生不言弃的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-578970.html

到了这里,关于[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM基础篇-程序计数器

    定义 Program Counter Register 程序计数器(寄存器) 作用:记住下一条jvm指令的执行地址 特点 是线程私有的:每个线程都有自己的程序计数器 不会存在内存溢出(规定) 作用 左侧: jvm 指令 右侧: java 代码 解释器将jvm指令解释为机器码,然后交给CPU去执行,同时将下下一条指令地址放入

    2024年02月14日
    浏览(34)
  • 深入理解JVM虚拟机第十三篇:详解JVM中的程序计数器

    😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783824   📚📚  工作微信:BigTreeJava 拉你进微信群,免费领取! 🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

    2024年02月08日
    浏览(41)
  • JVM内存管理、内存分区:堆、方法区、虚拟机栈、本地方法栈、程序计数器

    线程共享 堆         存放 实例 ,字符串常量(直接引用),静态变量,线程分配缓冲区(TLAB线程私有)。 垃圾收集器 管理的区域 方法区         非堆,和堆相对的概念。存储已被虚拟机加载的 类型信息 、常量、静态变量、即时编译器编译后的代码缓存等数据,内

    2024年02月10日
    浏览(33)
  • 基于OpenCV和PyQt5的跳绳计数器应用程序

    本文将介绍一个基于OpenCV和PyQt5的跳绳计数器应用程序。该程序可以使用计算机摄像头来检测跳绳动作,并计算跳绳次数。本文将介绍程序的实现方法和实现细节,包括背景减除算法和轮廓检测算法的使用。 背景减除算法是一种常用的图像处理技术,用于从静态摄像头拍摄的

    2024年02月07日
    浏览(45)
  • 【单周期CPU】LoongArch | 32位寄存器DR | 32位的程序计数器PC | 通用寄存器堆Registers | 32位RAM存储器

    前言: 本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本时序逻辑部件设计。 💻环境:一台内存4GB以上,装有64位Windows操作系统和Vivado 2017.4以上版本软件的PC机。 💎本章所采用的指令为

    2024年02月12日
    浏览(35)
  • Python中的计数器Counter

    计数器counter是包含在collections模块中的容器。 什么是容器Container? 容器是容纳对象的对象。它们提供了一种访问所包含对象并对其进行迭代的方法。内置容器的例子有元组、列表和字典。其他内容包含在“collections”模块中。 Counter是dict的子类。因此,它是一个无序的集合,

    2024年02月10日
    浏览(30)
  • C++笔记之rolling counter(滚动计数器)

    一个 rolling counter(滚动计数器)是一个计数器,可以在给定的范围内不断增加,当达到最大值时会从最小值重新开始。 code review! 在上面的代码中, RollingCounter 类用于实现滚动计数器。它接受三个参数:最小值、最大值和起始值(默认为0)。 increment 函数用于增加计数器的值

    2024年02月11日
    浏览(28)
  • Jmeter——循环控制器中实现Counter计数器的次数重置

    近期在使用Jmeter编写个辅助测试的脚本,用到了多个Loop Controller和Counter。 当时想的思路就是三个可变的数量值,使用循环实现;但第三个可变值的数量次数,是基于第二次循环中得到的结果才能确认最终次数,每次的结果还会有不一样的情况。基于思路,先写了个线性脚本

    2024年03月18日
    浏览(46)
  • 【鸿蒙软件开发】ArkUI之容器组件Counter(计数器组件)、Flex(弹性布局)

    Counter容器组件:计数器组件,提供相应的增加或者减少的计数操作。 Flex容器组件:以弹性方式布局子组件的容器组件。 计数器组件,提供相应的增加或者减少的计数操作。 说明 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本

    2024年02月06日
    浏览(34)
  • JVM运行时数据区的必备知识:Java程序员不容错过

    JVM运行时数据区是Java虚拟机在执行Java程序时所使用的内存区域。这些区域包括了以下几个部分: 程序计数器(Program Counter Register):程序计数器是一块较小的内存区域,它可以看作是当前线程所执行的字节码的行号指示器。每一个线程都有自己独立的程序计数器,用于记录

    2023年04月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包