JVM如何通过PC知道当前的方法

  • 本文关键字:方法 何通过 PC JVM jvm
  • 更新时间 :
  • 英文 :


在8086中,我们可以通过CS:PC知道下一条要执行的指令,其中PC是当前代码段(CS)中的偏移量。

但是,我不确定JVM是如何知道执行哪条指令的。

JVM中的PC寄存器仅指示当前方法中的偏移量,但它如何知道它在哪个方法中?

谢谢!

我注意到每个方法的代码都是从0开始的,就像在这里输入图像描述

那么,如果一个类中有很多方法,我怎么知道当前帧在哪个方法中呢?

我是Java新手,所以我的问题可能是愚蠢的,我的解释是错误的。谢谢你的耐心!

好的,那么我假设您正在询问与Java虚拟机规范(JVM)相关的JVM。规范中最直接相关的部分是:

2.5.1。pc寄存器

Java虚拟机可以支持多个线程同时执行(JLS§17)。每个Java虚拟机线程都有自己的pc程序计数器寄存器)。在任何时候,每个Java虚拟机线程都是执行单个方法的代码,即当前方法(§2.6)。如果该方法不是本机的,则pc寄存器包含当前Java虚拟机指令的地址被执行。如果线程当前正在执行该方法是本机,则Java虚拟机的pc寄存器的值是未定义的。Java虚拟机的pc寄存器足够宽保存一个returnAddress或一个特定平台上的本地指针。

注意强调的句子。它说地址正在执行的指令的。它没有说指令的偏移量从方法的代码段开始…正如你所说的。

此外,没有明显的对保存当前方法指针的寄存器的引用。描述调用堆栈的部分没有提到堆栈帧中任何指向当前方法的指针。


说了这么多,JVM规范实际上是JVM实现需要遵守的行为规范。它没有直接强制指定的行为必须以任何特定的方式实现。

因此,虽然它似乎声明抽象JVM有一个名为PC的寄存器,其中包含一个"地址",但它并没有明确地说明地址在这种情况下意味着什么。例如,它不排除解释器表示"地址"的可能性;在PC中作为由方法地址和方法内的字节码偏移量组成的元组。或者别的什么。真正重要的是JVM实现可以以某种方式使用PC来获得要执行的字节码指令。

相关内容

最新更新