首页 > 编程知识 正文

jvm本地方法栈,pc寄存器中存放的是

时间:2023-05-03 16:34:45 阅读:126872 作者:631

pc寄存器介绍

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

java没有寄存器吗? 其实可以说存在的是jvm中的pc寄存器,可以理解为cpu中寄存器类似的一个结构、抽象的模拟,而不是一个。 这里是软件级的概念

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

那是个小内存空间,几乎可以无视而记不住。 也是运行速度最快的存储区。

JVM规范中,每个线程都有自己的程序计数器,是线程的专用,生命周期与线程的生命周期相匹配。

每个时间每个线程只运行一种方法。 也就是现在的方法。 程序计数器存储当前线程正在执行的Java方法的JVM指令地址。 或者,如果正在运行本机(native )方法,则未指定值(undefned )。 pc寄存器调用虚拟机堆栈,是java级寄存器,但本地方法是本地方法堆栈,是c级,因此pc寄存器值指示undefned

这是程序控制流的指示符,分支、循环、跳转、异常处理、线程恢复等基础功能需要依赖于该计数器来进行。 就像光标和集合的迭代器。

字节码解释器通过修改此计数器的值并选择下一个要执行的字节码命令来工作。

这是Java虚拟机规范中唯一没有规定OutOtMemoryError情况的区域。 (堆栈只有堆栈,没有gc。 堆和方法区域有gc。 电脑不办公。 虚拟机堆栈的本地方法堆栈、堆和方法空间溢出,因此有oom )

pc寄存器的作用示例publicclasspcregistertest { publicstaticvoidmain (string [ ] args ) { int i=10; int j=20; int k=i j; }

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

因为CPU需要不断切换每个线程,所以此时切换回来后,您需要知道接下来要从哪里继续运行。

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

例如:

为什么PC寄存器设置为线程专用?

我们知道多线程是一种在特定时间段只运行一个线程的方法,CPU不断地在任务之间切换,导致频繁的中断和恢复。 怎么做到毫厘不爽呢? 为了准确地记录每个线程正在执行的当前字节码指令地址,向每个线程分配PC寄存器是最好的方式,可以在每个线程之间执行独立的计算,并且彼此不会干扰。

由于CPU时间片的限制,许多线程在并发执行过程中,在某个特定时间点,一个处理器或多核处理器中的一个内核只执行一个线程中的一个指令。 这必然会导致频繁的中断和恢复,如何保证点不错呢? 每个线程创建后生成自己的程序计数器和堆栈帧,程序计数器在每个线程之间互不影响。

也就是说,每个线程都是自己的专用pc寄存器,必须为每个线程分别记录自己的地址值(下一个指令的位置)。 cpu同时执行,切换到其他线程后,也知道自己该线程的下一个指令应该执行什么。 cpu切换到那个线程后,我知道自己接下来该做什么。 如果是共享的,则由于切换到其他线程时pc寄存器中记录的数据发生了变化,而ygdyet切换到原始线程时pc寄存器的值发生了变化,因此找不到下一个要执行的指令。 因此,每个线程都需要自己的pc寄存器。

CPU时间片CPU时间片,即CPU分配给每个程序的时间,按线程分配时间段称为该时间片。

宏.在上面:中,可以同时打开多个APP应用程序。 各程序并行不矛盾,同时运行。 但是,由于微观.上:只有一个CPU,所以一次只能处理程序的部分请求。 如何处理公平,一个方法是引入时间片,按程序顺序执行。

串行、并行和并发线程的执行方法如下。

串行:

并行:

并发:

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