首页 > 编程知识 正文

程序计数器属于什么部件,程序计数器用于存放什么

时间:2023-05-05 19:13:40 阅读:126861 作者:1487

可以看到程序计数器是基于每一个线程的,每一个线程都有一个程序计数器。

在JVM的程序计数寄存器(Program Counter Register )中,Register的名称来源于CPU的寄存器,寄存器中存储与指令相关的字段信息。 CPU必须将数据加载到寄存器中才能工作。 在这里,翻译成PC计数器(或指令计数器)可能更合适,而不是广义上的物理寄存器。 另外,也称为程序挂钩。 (也不易发生不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。

活动PC寄存器用于存储指向下一个指令的地址,即即将执行的指令代码。 执行引擎读取以下命令:

启用堆栈帧的方法在每个堆栈帧之间进行相互调用。 堆栈帧中的指令有行号标记,pc寄存器相当于此行号标记。 执行引擎得到标识符(地址)执行以下指令,完成后到pc寄存器取地址继续执行。 总之,pc寄存器只是存储指令的地址。

那是个小内存空间,几乎可以无视而记不住。 也是运行速度最快的存储区。 JVM规范中,每个线程都有自己的程序计数器,是线程的专用,生命周期与线程的生命周期相匹配。 每个时间一个线程只运行一种方法。 也就是现在的方法。 程序计数器存储当前线程正在执行的Java方法的JVM指令地址。 或者,如果正在运行native方法,则未指定值(undefined )。 这是程序控制流的指示符,分支、循环、跳转、异常处理、线程恢复等基础功能需要依赖于该计数器来进行。 字节码解释器通过修改此计数器的值并选择下一个要执行的字节码命令来工作。 唯一没有在Java虚拟机规范中规定内存外错情况的地区情况显示了GC。 只有堆和方法区有GC垃圾收集,其余没有GC垃圾收集

未出现自动存储器溢出异常(oom ) pc寄存器,其馀的可能全部溢出

例如,publicstaticvoidmain (字符串[ ] args ) ) { hel hel=new hel; hel.add (; } public int add () { int c=3; int d=4; 返回光盘; 反向编译class文件

图像左侧的0-7为指令地址(偏移地址),右侧为操作指令。

PC寄存器的面试问题使用PC寄存器保存字节码的指令地址有什么用呢? 为什么要使用PC寄存器记录当前线程的执行地址? 因为CPU需要不断切换每个线程,所以此时切换回来后,您需要知道接下来要从哪里继续运行。

JVM的字节码解释器需要通过改变PC寄存器的值来明确接下来应该执行什么样的字节码指令。

为什么PC寄存器设置为私有? 我们知道,多线程是一种在特定时间段只运行其中一个线程的方法,由于CPU不断切换任务,必然会导致频繁的中断和恢复。 怎么做到毫厘不爽呢? 为了准确记录每个线程运行的当前字节码指令地址,最好的方法是为每个线程分配PC寄存器,这样可以在每个线程之间进行独立的计算,从而避免相互干扰。

由于CPU时间片的限制,许多线程在并发执行过程中,在某个特定时间点,一个处理器或多核处理器中的一个内核只执行一个线程中的一个指令。

这必然会导致频繁的中断和恢复,如何保证点不错呢? 每个线程创建后生成自己的程序计数器和堆栈帧,程序计数器在每个线程之间互不影响。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。