java - 即时编译和堆栈替换之间的区别

标签 java compiler-construction jvm jit vm-implementation

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

除此之外,还有其他区别吗?

最佳答案

一般来说,即时编译是指在运行时编译 native 代码并执行它而不是(或附加于)解释。一些虚拟机,比如 Google V8,甚至没有解释器;他们 JIT 编译每个被执行的函数(具有不同程度的优化)。

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

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

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

关于java - 即时编译和堆栈替换之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9105505/

相关文章:

java - 我的 JVM 内存泄漏在哪里?垃圾收集器工作正常吗?

java - "-XX:+UseInterpreter"这个参数有什么作用?

java - 我如何在 JSF 中使用带有 UIData 的 java.util.Set。特别是 h :datatable?

java - 如果最小化,Swing 应用程序会崩溃

compiler-construction - 验证OCaml函数是否为尾递归

c - 多字符字符常量 [-Wmultichar] C 中的错误

java - 日期应该如何发布到java?

java - 如何使用 Java 中的 Graphics2D 对象创建具有混合模式的矩形?

c++ - 如何将编译扩展到函数或循环

java - 如何查看内存地址处的对象?