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

Cha*_*ani 43 java compiler-construction jit jvm vm-implementation

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

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

Jay*_*rod 64

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

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

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

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


Ant*_*oly 12

是的,这就是它.即时编译可以通过将字节码的"热点"(已知/应该经常执行的字节码点)编译为本机指令来提高性能.堆栈替换通过在编译版本可用时替换长时间运行的解释"热"字节码来补充JIT功能.上面提到的On-Stack Replacement文章展示了一个很好的例子,如果没有OSR,JIT编译就不会很有用.

  • 不幸的是,文章链接不再起作用.这是关于OSR的另一篇文章:http://xmlandmore.blogspot.com/2012/06/on-stack-replacement-in-hotspot-jvm.html (5认同)