V8 中的堆栈替换

On-Stack-Replacement in V8

当循环执行次数足够时,将触发OSR优化。标记和触发优化任务将发生在 JumpLoop 处理程序中。关于 V8 中 OSR 的两个问题:

  1. 不同于普通的函数优化,OSR优化作业不会在标记后的下一回合触发。在标记和触发 opt-job 之间可能需要很长时间,为什么?什么条件?

  2. 如何在优化代码中继续执行中断的函数?

Re 1.出于多种原因,非OSR优化通常更可取(简而言之,生成的代码会更好)。只有当相关函数在一个循环中花费 真正 很长时间时,才值得进行 OSR。所以稍等一下的目的是看循环是否足够快完成。

Re 2. 这就是堆栈替换的“魔力”:堆栈帧的内容被转换为该函数的优化代码所需的格式,然后优化代码中的一个特殊入口点是能够从中断点恢复执行。 (这就是为什么非 OSR 代码更可取的原因之一:它不需要这个特殊的入口点。)