即时编译和堆栈替换之间的差异

时间:2012-02-02 00:29:40

标签: java compiler-construction jvm jit vm-implementation

他们两人几乎做同样的事情。确定方法很热并编译它而不是解释。使用OSR,您只需在编译后立即转移到编译版本,这与JIT不同,后者在第二次调用方法时调用编译代码。

除此之外,还有其他差异吗?

2 个答案:

答案 0 :(得分:57)

通常,即时编译是指在运行时编译本机代码并执行它而不是(或除了)解释。一些虚拟机,如谷歌V8,甚至没有翻译;他们JIT编译每个执行的函数(具有不同程度的优化)。

堆栈替换(OSR)是一种用于在同一功能的不同实现之间切换的技术。例如,您可以使用OSR在完成编译后立即从解释或未优化的代码切换到JITed代码。

OSR在运行时将功能识别为“热”的情况下非常有用。这可能不一定是因为函数被频繁调用;它可能只被调用一次,但它花费了大量时间在一个可以从优化中受益的大循环中。当OSR发生时,VM暂停,目标函数的堆栈帧被等效帧替换,该等效帧可能具有不同位置的变量。

OSR也可以在另一个方向发生:从优化代码到未优化代码或解释代码。优化的代码可以基于过去的行为对程序的运行时行为做出一些假设。例如,如果您只看过一种类型的接收器对象,则可以将虚拟或动态方法调用转换为静态调用。如果后来证明这些假设是错误的,那么可以使用OSR回退到更保守的实现:优化的堆栈帧被转换为未优化的堆栈帧。如果VM支持内联,您甚至可能最终将优化的堆栈帧转换为几个未优化的堆栈帧。

答案 1 :(得分:11)

是的,就是这样。 Just-in-time compilation可以通过将字节码的“热点”(已知/应该经常执行的字节码点)编译为本机指令来提高性能。 On-Stack Replacement补充了JIT功能,通过它的编译版本可用时替换长时间运行的解释“热”字节码。提到的On-Stack Replacement article显示了一个很好的例子,如果没有OSR,JIT编译就不会很有用。