当前位置:网站首页>JVM内存和垃圾回收-04.程序计数器(PC寄存器)
JVM内存和垃圾回收-04.程序计数器(PC寄存器)
2022-08-02 18:40:00 【J___code】
1.PC寄存器
- 存储指向下一条指令的地址,由执行引擎根据PC寄存器读取下一条指令。下图中一个栈帧相当于一个方法,假设当前栈帧的局部变量表地址为1,操作数栈为2,PC寄存器就是存储该地址:
- 它是很小的内存空间,也是运行速度最快的存储区域
- 因为每个线程都有自己的PC寄存器,所以它的生命周期和线程的一致
- 任何时间一个线程只能有一个方法在执行(即当前方法)。PC寄存器会存储当前方法的JVM指令地址;如果是执行本地方法,则为未指定值(因为PC寄存器是Java层面的寄存器)
- 它是程序控制流的指示器,比如循环、线程恢复等都依赖它
- 字节码解释器工作时通过改变它的值来选取下一条需要执行的字节码指令
tips:
- 寄存器存储指令相关的现场信息,CPU只有把数据装载到寄存器才能运行
- JVM的PC寄存器是对物理PC寄存器的抽象模拟
- PC寄存器是唯一在JVM中没有GC和OOM的(虚拟机栈或本地方法栈没有GC但有可能溢出,方法区和堆也可能溢出)
2.举例说明
- 假设Java程序代码如下:
public static void main(String[] args) { int i = 10; int j = 20; int k = i + j; }
将其进行反编译后:
3.常见问题
使用PC寄存器存储字节码指令地址的作用?
JVM字节码解释器需要通过改变PC寄存器的值明确下一条该执行什么字节码指令
为什么使用PC寄存器记录当前线程的执行地址?
因为CPU需要不停的切换线程,切换回来后需要知道从哪里继续执行
PC寄存器为什么被设定为线程私有?
因为CPU会不停在多个线程中做任务切换,为了能够准确记录各个线程正在执行的当前字节码指令地址,所以为每个线程分配一个PC寄存器,这样每个线程可以独立计算,避免线程间相互干扰的情况
边栏推荐
- What skills are the most practical for college students in communications?
- arcgis 分子式标注
- 洛谷P1966 火柴排队
- SQL Alias Aliases
- MYSQL关键字执行顺序?
- Monitor is easy to Mars debut: distributed operations help TOP3000 across management gap
- How to mitigate the attack of corporate account hijacking?
- mongodb的游标
- ETH Zurich重磅综述 | 人脸-素描合成:一个新的挑战
- 日常开发中,String类中常用的方法
猜你喜欢
随机推荐
备战无人机配送:互联网派To C、技术派To B
进程与线程
说一件事
3 and a half years of testing experience, I don't have 20K, it seems it's time to change jobs
看【C语言】实现简易计算器教程,让小伙伴们为你竖起大拇指
香农与信息论三大定律
mongodb的游标
I have 8 years of experience in the Ali test, and I was able to survive by relying on this understanding.
LeetCode 2343. 裁剪数字后查询第 K 小的数字
请教下,1.0.0和1.0.2的底层数据库表结构有变化吗?
Jupyter Notebook(Anaconda)——两个环境分别修改默认打开目录(深度学习第一周番外篇)
洛谷P4316 绿豆蛙的归宿
Detailed explanation of AtomicInteger
How to mitigate the attack of corporate account hijacking?
LeetCode 1947. 最大兼容性评分和(状态枚举DP)
Three components of NIO foundation
LeetCode 2349. 设计数字容器系统(SortedSet)
中断向量表概述
喜迎八一 《社会企业开展应聘文职人员培训规范》团体标准出版发行会暨橄榄枝大课堂上线发布会在北京举行
[深入研究4G/5G/6G专题-49]: 5G Link Adaption链路自适应-5-上行链路自适应ULLA-PUSCH信道