JVM教程-4-程序计数器

JVM刨根问底之程序计数器 祝大家每日进步,有技术问题多多交流,同时欢迎大家关注我的头条号:IT人孙会良 工作之余,总结一下JVM相关知识,同时欢迎大家关注我,共同探讨技术和前沿应用。 Java虚拟机在执行java程序的过程中将其管理的内存分为不同的区域,有些区域随虚拟机进程的启动而存在,有些区域则依赖于用户进程的启动和结束来建立和销毁。java虚拟机管理的内存包括如下几个区域: 1.什么是程序计数器? 程............... 阅读详情

PC Register介绍

转载:https://www.bilibili.com/video/BV1PJ411n7xZ
参考:https://gitee.com/moxi159753/LearningNotes/tree/master/JVM

JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。
在这里插入图片描述

  1. 它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。
  2. 在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。
  3. 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址;或者,如果是在执行native方法,则是未指定值(undefned)【native修饰的方法,非java语言写】
  4. 它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
  5. 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
  6. 它是唯一一个在Java虚拟机规范中没有规定任何outotMemoryError情况的区域。

作用

PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。(保存执行引擎将要提取的下一条指令的地址)
在这里插入图片描述

代码例子

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

    String s="abc";
    System.out.println(s);
    System.out.println(i);
    System.out.println(k);
}

在这里插入图片描述

两个常见问题

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

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

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

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

提示

  • pc寄存器只保存执行引擎将要提取的下一条指令的地址,不保留当前指令地址
  • cpu一个核只能执行一个线程,不断地切换线程来执行线程
  • 并发交替起来看上去像并行

CPU时间片

CPU时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片。
在宏观上:俄们可以同时打开多个应用程序,每个程序并行不悖,同时运行。
但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。
在这里插入图片描述

深入解析JESD204B Periodic SYSREF在多ADC/DAC系统中的同步优化策略 本文深入探讨了JESD204B Periodic SYSREF在多ADC/DAC系统中的同步优化策略,针对雷达阵列和宽带通信系统中的同步精度问题,详细解析了硬件实现细节、参数配置实战经验及系统级优化方法。通过案例分析和技术要点,帮助工程师解决由温度漂移和时钟抖动引起的同步挑战,提升系统性能。 阅读详情

相关推荐

miniDP与DP管脚定义差异详解及设计避坑指南

本文详细解析了Mini DisplayPort与标准DisplayPort接口在管脚定义上的核心差异,通过对比表格直观展示了两者20针脚的不同排列方式,特别是高速差分信号线的分布。文章结合真实设计案例,为硬件工程师提供了从原理图设计、PCB布局到信号完整性考量及故障排查的完整避坑指南,强调绝不能将两者视为简单的物理缩小版。

weixin_29248653的博客 362

JVM程序计数器

Program Counter Register,又叫程序计数寄存器在物理上程序计数器叫寄存器CPU只有把数据装载到寄存器中才能够正常执行指令。

Cyx12321的博客 415

配置VS Code使用Linux服务器上的Matlab

0、需求 Linux服务器上安装有Matlab 无图形界面,只能使用命令行工具,编辑文件不方便 1、VS Code插件安装 在扩展商店中搜索matlab,会出现Matlab Extension Pack,里面有整理好的matlab扩展 这里只安装了第一排的三个扩展 2、设置(Windows、Mac的设置类似,只是不同系统的文件路径不同) 安装好扩展,重启VS Code后,进行设置 打开:文件→首选项→设置(或快捷键ctrl+,),搜索matlab,结果如下图所示;直接打开完整json配置文件(图

赵彬的博客 5008

程序计数器(重点理解)

程序计数器是一个指针或计数器,它指示当前正在执行的指令在程序中的位置。在Java虚拟机中,程序计数器是每个线程私有的,是线程上下文的一部分。由于Java中多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,因此在任何特定时间,每个处理器只能执行一个线程的指令。程序计数器帮助虚拟机跟踪每个线程当前执行到的位置,并在线程切换时保存和恢复执行状态。程序计数器在Java虚拟机中扮演着至关重要的角色。它用于记录当前线程正在执行的字节码指令的地址,是实现Java多线程的重要机制之一。

Flying_Fish_roe的博客 2533

Ubuntu 26.04 本地安装 GitLab CE 完整教程(非 Docker 方式)

本文详细介绍了在Ubuntu 26.04系统上通过Omnibus包安装GitLab CE的完整流程。主要内容包括:环境准备(系统要求、依赖安装)、配置清华镜像源、执行安装命令、修改配置文件、服务管理命令以及常见问题解决方法。文章特别强调了内存要求(建议4GB以上)、首次登录密码获取、HTTPS安全配置等关键点,并提供了性能优化建议和安全设置指导。相比Docker方式,Omnibus安装具有性能更好、管理方便等优势,适合需要私有化部署GitLab的场景。

1369

基于ST32 DAC7311数模转换器驱动代码及电路设计完整版

基于ST32的DAC7311模数转换器的电路设计及驱动代码完整版

qq_39626643的博客 3718

程序计数器(线程私有)

程序计数器的特点与作用

scj1022的博客 846

Ubuntu20.04下Intel AX201网卡驱动安装全攻略:从内核升级到固件更新

本文详细介绍了在Ubuntu 20.04系统上解决Intel AX201无线网卡驱动问题的完整方案。针对戴尔游匣G15等新硬件,通过升级内核至HWE版本、从官方仓库获取最新固件文件,并调整BIOS设置,彻底解决Wi-Fi无法识别或连接不稳定的问题,为开发者提供了一套从诊断到修复的实践指南。

gpt4scribbler的博客 689

通俗易懂:JVM中的程序计数器在多线程环境下是如何工作的?

在Java虚拟机(JVM)中,程序计数器(Program Counter Register,简称PC寄存器)是每一个线程独享的一个内存区域,它是JVM运行时数据区域的一部分。在多线程环境下,程序计数器

pengweid专栏 547

基于Java的OPC UA Server开发指南:从零开始构建高效服务器

本文介绍了如何使用开源项目org.eclipse.milo创建Java OPC UA Server。通过创建Spring Boot项目,添加Milo SDK依赖,定义Namespace类,服务器启动类以及监听器,详细阐述了建立OPC UA Server服务的步骤。启动后,服务器默认监听地址为opc.tcp://localhost:12685,可使用Softing OPC Client进行连接。

洛阳泰山的博客 3022

华为OD机试真题2025双机位C卷 Java&Go 实现【统计员工影响力分数】

华为OD机试真题2025双机位C卷 C语言 实现【统计员工影响力分数】假设你是大型科技公司的数据分析师,负责分析公司内部员工的社交网络。你需要编写一个函数来计算每个员工的影响力分数。影响力分数定义为该员工直接和间接影响的员工数量。 输入描述

MISAYAONE的博客 278

一分钟弄懂线程程序计数器

程序计数器为什么是线程私有的? 1.程序计数器 1.1.程序计数器的本质 从本质来看,程序技术器就是一块比较小的内存空间。 1.2.程序计数器的作用 程序计数器可以看作是当前线程所执行字节码的行号指示器,也就是说,程序计数器这块小空间里面记录的是当前线程正在执行的字节码的行号。字节码解释器通过改变计数器的值来获取下一条要执行的字节码。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 1.3.为什么程序计数器被设计成线程私有的? 假如现在有一本书,有好几个同学都...

Jiangtagong的博客 1386

OpenClaw 自定义 Skill 开发完整指南(最新版)

OpenClaw 中的每个 Skill,本质是一套“能力描述 + 执行逻辑”的组合包,核心特征如下:核心载体:以文件夹为单位,文件夹内必须包含SKILL.md文件(能力描述核心);扩展文件:可选agent.py(Python 执行逻辑)、index.ts(TypeScript 执行逻辑)、(辅助文档/示例资源)等;核心优势:AI 通过阅读 SKILL.md 的自然语言描述理解技能,无需严格遵循代码接口,灵活度极高;

haolove527的专栏 2万+

JVM - 程序计数器

JVM - 程序计数器

目目沐沐 5万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JVM 程序计数器

程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。- - 摘自《深入理解Java虚拟机》 特 点 如果线程正在执行的是Java 方法,则这个计数器记录的是正在执行的虚拟机字节码指令地址 如果正在

leaf_0303的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

程序计数器简介、程序计数器举例说明、程序计数器常见问题

码说芯语的博客 2383

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【JVM】JVM01(概述-程序计数器-栈-堆)

jvm入门

wenwenaier的博客 2002

什么是JVM中的程序计数器

什么是JVM中的程序计数器

qq_63945982的博客 980

JVM程序计数器:核心机制与优化

💡亲爱的技术伙伴们:你是否正被这些问题困扰——我打磨的《 Java高级开发岗面试急救包》正式上线!课程介绍如下:📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》、(架构篇)、作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

JavaCodePro的博客 1069

【JVM 02-JVM内存结构之-程序计数器】

Program Counter Register 程序计数器当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。此后经过分析指令,执行指令。完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。JVM中的程序计数寄存器(Program Counter Register)中, Register 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。

爱喝阔落的猫的博客 1267

jvm之程序计数器

java虚拟机运行时数据区的程序计数器

Littewood的博客 715

JVM之程序计数器

JVM中的程序计数寄存器 (Proqram Counter Register)中,Reqister 的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器) 会更加贴切(也称为程序钩子) ,并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。

欢迎每一位朋友不吝赐教,无论是宝贵的建议还是中肯的批评,都将是我前进路上不可或缺的灯塔 949

jvm程序计数器

程序计数器 介绍 JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。 它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。 在JVM规范中,每个线程都有它自

Hai-Yang-code的博客 1130
上一篇: JVM教程-3-运行时数据区概述及线程
下一篇: JVM教程-5-虚拟机栈
zgcadmin
博客等级 码龄9年 174粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值