我了解on-stack replacement(OSR)通常是如何工作的,但是我不了解的是,一旦OSR编译方法离开触发编译的初始调用,该方法是否曾经有用-可以在后续迭代中使用JITed代码吗? ?
看起来,一旦解释器继续使用旧的OSR开始使用的相同字节码索引,就可以再次进入OSR编译的方法。
我之所以这么问是因为,我看到一种情况,即Hotspot立即OSR对我的方法进行两次编译(针对不同的BCI),但是直到运行了几分钟后,它才进行常规的C2非OSR编译(尽管该方法调用了100万次或更多)。所以我想知道它是否在同时使用OSR C2方法(还有一种非OSR C1方法)?
最佳答案
是的,它们可以重复使用。但是仅在生成它们的字节码索引相同的情况下,并且仅响应编译策略的反向分支事件。
HotSpot InstanceKlass
结构(Java类的内部表示形式)为该类保留一个list of OSR methods。每当请求编译时,CompileBroker looks for此列表中的现有NMethod。
如果不仔细查看,我无法告诉您很多特殊情况,但是从给出的描述中,我怀疑您的应用程序调用的是C1编译版本。方法的入口点永远不会设置为OSR编译的NMethod。