详细
Java 虚拟机还存在着另一种以循环为单位的即时编译,叫做 On-Stack-Replacement(OSR)编译。<br>循环回边计数器便是用来触发这种类型的编译的。
OSR 实际上是一种技术,它指的是在程序执行过程中,<b>动态地替换掉 Java 方法栈桢</b>,从而使得程序能够在非方法入口处进行解释执行和编译后的代码之间的切换。事实上,去优化(deoptimization)采用的技术也可以称之为 OSR。
触发 OSR 编译的阈值是由参数 -XX:CompileThreshold 指定的阈值的倍数。<br>(OnStackReplacePercentage - InterpreterProfilePercentage)/100<br>其中-XX:InterpreterProfilePercentage的默认值为33,当使用C1时-XX:OnStackReplacePercentage为933,当使用C2时为140。