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

时间:2016-12-14 16:51:16

标签: java performance jvm jit jvm-hotspot

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

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

我问的主要是因为我看到一个案例,Hotspot立即OSR编译我的方法两次(对于不同的BCI),但是甚至没有做正常的C2非OSR编译,直到它为一对夫妇运行分钟(尽管该方法有数百万次或更多的电话)。所以我想知道它是否在此期间使用OSR C2方法(还有非OSR C1方法)?

1 个答案:

答案 0 :(得分:1)

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

HotSpot InstanceKlass结构(Java类的内部表示)为类保留list of OSR methods。每当请求编译时,CompileBroker looks for都会在此列表中显示现有的NMethod。

我无法仔细研究你的具体情况,但从给定的描述我怀疑你的应用程序调用C1编译版本。方法的入口点永远不会设置为OSR编译的NMethod。