VM 如何从解释转换为 运行 JITed 代码?

How does a VM switch from interpreting to running JITed code?

Whosebug 上有一些关于 JIT 的很好的解释,比如 this one

所有这些解释让我想知道的一件事是:

如果一半的字节码已被 JIT,那么您可能混合使用了字节码和机器码,或者在某些时候您需要在解释字节码和 运行 编译机器码之间切换。

虚拟机如何从一种方案过渡到另一种方案?

相关: 特别是关于 java,我正在寻找关于实施策略的一般答案

大多数软件问题都可以通过额外的间接级别来解决。 VM 在 table 中跟踪加载的函数,其中包含遇到 CALL 字节代码时运行的代码的机器代码地址。这个地址起初不是函数的实际地址。

跟踪抖动将其初始化为解释器中的入口点。所以当函数被调用时,它只是继续解释函数的字节码。还保留统计数据以确定什么是 "hot"。当热因子足够高时,它会运行抖动以将函数的字节码转换为机器码。并将 table 中的地址修补为该机器码。所以下一个 CALL 现在会自动跳转到该机器代码而不是解释器入口点。

非跟踪抖动的作用大致相同,table中的地址被初始化为抖动中的入口点。 CALL 字节代码被翻译成对该地址的机器代码调用。最终处理器执行该调用并陷入抖动。它为函数生成机器代码并将调用指令修补到该机器代码地址。以及 table 条目。因此,对同一函数的任何后续调用现在都会自动绕过抖动并直接执行机器代码。