JVM运行时数据区——程序计数器

1、程序计数器介绍

JVM中的程序计数器英文全称是Program Counter Register,其中Register的命名源于CPU的寄存器,寄存器用于存储指令相关的现场信息,CPU只有把数据装载到寄存器才能够运行。

程序计数器中的寄存器并非是广义上所指的物理寄存器,或许将其翻译为指令计数器会更加贴切(也称为程序钩子),并且也可以避免一些不必要的误会,为了使用习惯,本帖还是使用程序计数器来表示Program Counter Register。JVM中的程序计数器是对物理寄存器的一种抽象模拟。

程序计数器是一块较小的内存空间,如下图所示:
在这里插入图片描述
属于运行时数据区的一部分。它可以看作是当前线程所执行的字节码的行号指示器。在JVM的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器。分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成。

如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地(Native)方法,这个计数器值则应为空(Undefined)。此内存区域是唯一一个在“Java虚拟机规范”中没有规定任何OutOfMemoryError情况的区域。程序计数器既没有垃圾回收也没有内存溢出。

程序计数器用来存储下一条指令的地址,也就是将要执行的指令代码。由执行引擎读取下一条指令,如下图所示:
在这里插入图片描述
程序计数器是一块很小的内存空间,几乎可以忽略不计。它也是运行速度最快的存储区域。在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。

2、程序计数器举例说明

下面通过程序实现算式“3-4”的计算,讲述程序计数器的执行流程。相对应的字节码文件反编译后的结果,如下图所示:
在这里插入图片描述
如下图所示:
在这里插入图片描述
指令地址(偏移地址)就是程序计数器所存储的结构。上图中指令地址的5可以理解为程序计数器所存储的数据。执行引擎会在程序计数器存储5的位置读取相应的操作指令,接下来执行引擎会操作JVM的局部变量表、操作数栈进行存、取、加、减等运算操作,还需要将字节码指令翻译成相应的机器指令,再让对应的CPU进行运算。

3、程序计数器常见问题

(1)使用程序计数器存储字节码指令地址有什么用?为什么使用程序计数器记录当前线程的执行地址?因为CPU需要不停地切换各个线程,切换回来以后,就需要知道接着从哪里开始继续执行。JVM的字节码解释器通过改变程序计数器的值,来明确下一条应该执行什么样的字节码指令。

(2)程序计数器为什么会被设定为线程私有?CPU时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片。在宏观上,我们可以同时打开多个应用程序,每个程序同时运行。但在微观上,由于只有一个CPU,一次只能处理程序要求的一部分,为了处理公平,就要引入时间片,每个程序轮流执行,如下图所示:
在这里插入图片描述
所谓的多线程是在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个程序计数器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。如下图所示:
在这里插入图片描述
线程1、线程2和线程3分别由不同的程序计数器记录,假如当前程序执行的位置分别是5、7和17,这样当CPU做任务切换的时候,每个线程都有自己的记录,就可以有条不紊地恢复。

4、小结

重点讲解了运行时数据区的程序计数器,它可以看作是当前线程所执行的字节码的行号指示器,指示着下一条将要执行的字节码指令。通过案例可以详细地看出程序计数器在运行程序的线程中起到的作用。程序计数器是线程私有的,各线程之间程序计数器互不干扰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/416217.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

音频提取使用什么方法?视频提取音频

在数字技术与多媒体日益普及的今天,音频提取已成为一个常见且重要的任务。无论是为了制作视频、编辑音乐,还是进行语音识别和分析,我们都需要从原始材料中提取音频。那么,音频提取通常使用什么方法呢? 1. 使用专业的音…

vue-router4 (六) 路由嵌套

应用场景: ①比如京东页面的首页、购物车、我的按钮,可以点击切换到对应的页面; ② 比如 Ant Design左侧这些按钮点击就会切到对应的页面,此时可以把左侧按钮放在父路由中,右侧的子路由 1.路由配置,子路由…

NLP-词向量、Word2vec

Word2vec Skip-gram算法的核心部分 我们做什么来计算一个词在中心词的上下文中出现的概率? 似然函数 词已知,它的上下文单词的概率 相乘。 然后所有中心词的这个相乘数 再全部相乘,希望得到最大。 目标函数(代价函数&#xff0…

web学习笔记(二十二)DOM开始

目录 1.DOM简介 2.DOM树 3.DOM节点 4.查找DOM节点方法汇总 5.查找子结点的属性 5.1父子关系 5.2兄弟关系 6.几个特殊元素的查找 1.DOM简介 DOM(Document Object Model) 也叫页面文档对象模型,是W3C组织推荐的处理可扩展标记语言(HTML…

年度目标制定:数据驱动的深度策略,打造你的成功蓝图!

导语:在快节奏的生活中,制定年度目标不仅仅是为了完成任务,更是为了在一年中明确方向、聚焦重点、持续进步。而数据分析,则是我们制定年度目标时不可或缺的利器。通过深入挖掘数据,我们可以更准确地理解自己的需求、优…

数据中台的演进与实践——构建企业的数字核心_光点科技

数据中台,一个在近年来被频繁提及的概念,已经成为众多企业数字化转型的核心组成部分。然而,尽管它的重要性被业界广泛认可,对于数据中台的深入理解和有效实践仍然是许多企业面临的挑战。在本文中,我们将从数据中台的演…

在线原型工具有哪些比较好用?

随着云计算和5G网络的发展,互联网办公工具的发展 Web 这是一个不可避免的趋势。那么,对于产品设计团队来说,哪些在线设计工具值得体验呢?今天,让我们来看看一些国内外经典的在线原型工具。 即时设计 - 可实时协作的专…

React入门之react_jsx入门

简单语法写法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><script s…

yolov5v7v8目标检测增加计数功能--免费源码

在yolo系列中&#xff0c;很多网友都反馈过想要在目标检测的图片上&#xff0c;显示计数功能。其实官方已经实现了这个功能&#xff0c;只不过没有把相关的参数写到图片上。所以微智启软件工作室出一篇教程&#xff0c;教大家如何把计数的参数打印到图片上。 一、yolov5目标检测…

EAP-TLS实验之Ubuntu20.04环境搭建配置(FreeRADIUS3.0)(四)

该篇主要介绍了利用配置ca.cnf、server.cnf、client.cnf在certs路径下生成证书文件&#xff08;非执行bootstrap脚本&#xff0c;网上也有很多直接通过openssl命令方式生成的文章&#xff09;&#xff0c;主要参考&#xff08;概括中心思想&#xff09;官方手册&#xff0c;以及…

Android Kotlin协程实战

你能听懂的Kotlin协程课&#xff0c;跟老司机学&#xff0c;不用自己瞎折腾 认识协程 协程难在哪儿? Ja v a中不曾出现的&#xff0c;新概念概念不清晰&#xff0c;我们看到的大都是不同语言对于协程的实现或者衍生Kotlin 基础不扎实多线程编程基础太薄弱 协程是什么? 协…

快速搭建网站原型!8款网站原型软件推荐

现在&#xff0c;基于云的软件已经逐渐成为主流&#xff0c;网站原型设计工具也不例外。与桌面版本相比&#xff0c;在线原型工具具有独特的优势&#xff0c;无论您使用Linux&#xff0c;Mac 或者Windows&#xff0c;都不需要安装就可以使用这些工具。下面小编就为大家推荐8款非…

全面整理!机器学习常用的回归预测模型

Datawhale干货 作者&#xff1a;曾浩龙&#xff0c;Datawhale意向成员 前言 回归预测建模的核心是学习输入 到输出 &#xff08;其中 是连续值向量&#xff09;的映射关系。条件期望 是 到 的回归函数。简单来说&#xff0c;就是将样本的特征矩阵映射到样本标签空间。 图…

skiplist(高阶数据结构)

目录 一、概念 二、实现 三、对比 一、概念 skiplist是由William Pugh发明的&#xff0c;最早出现于他在1990年发表的论文《Skip Lists: A Probabilistic Alternative to Balanced Trees》 skiplist本质上是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;…

(k8s中)docker netty OOM问题记录

1、首先查看docker的内存占用情况&#xff1a; docker top 容器名 -u 查看内存cpu占用率&#xff08;容器名来自kubectl describe pod xxx中信息&#xff09; 可以看出内存一直增长&#xff0c;作为IO代理这是不正常的。 2、修改启动参数和配置文件 需要注意的是为了安全考…

BOOT电路

本质&#xff1a;BOOT电路本质上是单片机的引脚 作用&#xff1a;BOOT电路的作用是用于确定单片机的启动模式 使用方法&#xff1a;在单片机上电或者复位时给BOOT管脚设置为指定电平即可将单片机设置为指定启动模式。 原理&#xff1a;单片机上电或复位后会先启动内部晶振&a…

Vue的生命周期函数

今天我们来讲一讲Vue中的生命周期函数 每个Vue实例在其生命周期中都会经历多个关键阶段&#xff0c;这些阶段包括数据监听设置、模板编译、实例DOM挂载以及数据变化时的DOM更新等。同时&#xff0c;Vue提供了一系列生命周期钩子函数&#xff0c;允许开发者在这些重要阶段插入自…

EMR StarRocks实战——猿辅导的OLAP演进之路

目录 一、数据需求产生 二、OLAP选型 2.1 需求 2.2 调研 2.3 对比 三、StarRocks的优势 四、业务场景和技术方案 4.1 整体的数据架构 4.2 BI自助/报表/多维分析 4.3 实时事件分析 4.5 直播教室引擎性能监控 4.4 B端业务后台—斑马 4.5 学校端数据产品—飞象星球 4…

js 手写深拷贝方法

文章目录 一、深拷贝实现代码二、代码讲解2.1 obj.constructor(obj)2.2 防止循环引用 手写一个深拷贝是我们常见的面试题&#xff0c;在实现过程中我们需要考虑的类型很多&#xff0c;包括对象、数组、函数、日期等。以下就是深拷贝实现逻辑 一、深拷贝实现代码 const origin…

(转载)SpringCloud 微服务(三)-Seata解决分布式事务问题

ps:这个原文写的很好&#xff0c;怕后续这个地址失效&#xff0c;备份一个留着自己学习 转自&#xff1a;SpringCloud 微服务&#xff08;三&#xff09;-Seata解决分布式事务问题_seata 黑马 代码-CSDN博客 看完了黑马程序员的免费课程&#xff0c;感觉受益匪浅&#xff0c;…