我明白了 on-stack replacement (OSR)通常有效,但我不明白的是,一旦 OSR 编译的方法离开触发编译的初始调用,该方法是否有用 - JIT 代码可以在后续迭代中使用吗?
似乎可以,一旦解释器继续执行旧 OSR 启动的相同字节码索引,它就可以再次进入 OSR 编译的方法。
我问这个问题主要是因为我看到这样一种情况:Hotspot 立即 OSR 编译我的方法两次(针对不同的 BCI),但甚至不进行正常的 C2 非 OSR 编译,直到它运行了几次分钟(尽管对该方法的调用达到一百万次或更多)。所以我想知道它是否同时使用OSR C2方法(还有非OSR C1方法)?
最佳答案
是的,它们可以重复使用。但仅在生成它们的相同字节码索引处,并且仅响应编译策略的后分支事件。
HotSpot InstanceKlass
结构(Java 类的内部表示)保留 list of OSR methods为了类(class)。每当请求编译时,CompileBroker looks for此列表中现有的 NMethod。
如果不仔细观察,我无法详细说明您的具体情况,但根据给定的描述,我怀疑您的应用程序调用了 C1 编译版本。方法的入口点永远不会设置为 OSR 编译的 NMethod。
关于java - OSR 编译的方法可以被后续调用使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41147986/