【问题标题】:How does a VM switch from interpreting to running JITed code?虚拟机如何从解释代码切换到运行 JITed 代码?
【发布时间】:2015-08-28 08:50:19
【问题描述】:
stackoverflow 上有一些关于 JIT 的很好的解释,比如this one。
所有这些解释让我想知道的一件事是:
如果一半的字节码已经过 JIT 处理,那么您可能会混合使用字节码和机器码,或者在某些时候您需要在解释字节码和运行编译的机器码之间切换。
虚拟机如何从一种方案转换到另一种方案?
相关:this question 专门针对 java,我正在寻找有关实施策略的一般答案
【问题讨论】:
标签:
interpreter
bytecode
jit
vm-implementation
【解决方案1】:
大多数软件问题都可以通过额外的间接级别来解决。 VM 在一个表中跟踪加载的函数,该表包含遇到 CALL 字节码时运行的代码的机器码地址。这个地址起初不是函数的实际地址。
跟踪抖动将其初始化为解释器中的入口点。所以当函数被调用时,它只是不断地解释函数的字节码。还保留统计数据以确定什么是“热门”。当热度因子足够高时,它会运行抖动以将函数的字节码转换为机器码。并将表中的地址修补到该机器代码。因此,下一个 CALL 现在会自动跳转到该机器代码而不是解释器入口点。
非跟踪抖动的作用大致相同,表中的地址被初始化为抖动中的入口点。 CALL 字节码被翻译成对该地址的机器码调用。最终,处理器执行该调用并进入抖动状态。它生成函数的机器代码并将调用指令修补到该机器代码地址。以及表格条目。因此,对同一函数的任何后续调用现在都会自动绕过抖动并直接执行机器代码。