他们几乎都做同样的事情。确定该方法是热的并编译它而不是解释。使用 OSR,您只需在编译后立即转到已编译的版本,这与 JIT 不同,后者在第二次调用方法时调用已编译的代码。
除此之外,还有其他区别吗?
最佳答案
一般来说,即时编译是指在运行时编译 native 代码并执行它而不是(或附加于)解释。一些虚拟机,比如 Google V8,甚至没有解释器;他们 JIT 编译每个被执行的函数(具有不同程度的优化)。
堆栈替换 (OSR) 是一种在同一功能的不同实现之间切换的技术。例如,您可以使用 OSR 在编译完成后立即从解释代码或未优化代码切换到 JIT 代码。
OSR 在您将某个函数在运行时标识为“热”的情况下很有用。这可能不一定是因为该函数被频繁调用;它可能只被调用一次,但它会在一个大循环中花费大量时间,这可能会受益于优化。当 OSR 发生时,VM 会暂停,目标函数的堆栈帧被替换为可能在不同位置具有变量的等效帧。
OSR 也可能出现在另一个方向:从优化代码到未优化代码或解释代码。优化后的代码可能会根据过去的行为对程序的运行时行为做出一些假设。例如,如果您只见过一种类型的接收器对象,则可以将虚拟或动态方法调用转换为静态调用。如果后来证明这些假设是错误的,OSR 可用于回退到更保守的实现:优化的堆栈帧被转换为未优化的堆栈帧。如果 VM 支持内联,您甚至可能最终将优化的堆栈帧转换为 几个 未优化的堆栈帧。
关于java - 即时编译和堆栈替换之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9105505/