VM如何从解释切换到运行JITed代码?

时间:2015-08-28 08:50:19

标签: interpreter bytecode jit vm-implementation

对于stackoverflow,JIT有一些很好的解释,比如this one

所有这些解释都让我感到疑惑的是:

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

虚拟机如何从一个方案转换到另一个方案?

相关:this question专门针对java,我正在寻找关于实施策略的一般答案

1 个答案:

答案 0 :(得分:2)

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

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

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