后续调用可以使用 OSR 编译的方法吗?

Can OSR-compiled methods be used by a subsequent call?

我了解 on-stack replacement (OSR) 通常是如何工作的,但我不明白的是,一旦 OSR 编译的方法离开触发编译的初始调用,该方法是否有用 - JITed 可以吗代码用于后续迭代?

似乎可以,一旦解释器继续执行旧 OSR 启动的相同字节码索引,它就可以再次进入 OSR 编译的方法。

我之所以问,主要是因为我看到 Hotspot 立即 OSR 编译我的方法两次(针对不同的 BCI),但甚至不进行正常的 C2 非 OSR 编译,直到它被 运行 几分钟(尽管对该方法进行了一百万次或更多次调用)。所以我想知道它是否同时使用OSR C2方法(也有非OSR C1方法)?

是的,它们可以重复使用。但仅在为它们生成的相同字节码索引处,并且仅响应编译策略的后分支事件。

HotSpot InstanceKlass 结构(Java class 的内部表示)在此列表中保留 list of OSR methods for the class. Whenever a compilation is requested, CompileBroker looks for 现有的 NMethod。

如果不仔细查看,我无法详细说明您的具体情况,但根据给定的描述,我怀疑您的应用程序调用了 C1 编译版本。方法的入口点从未设置为 OSR 编译的 NMethod。