2016-12-14 71 views
1

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

看起来好像是这样,一旦解释器进入相同的字节码索引,旧OSR启动它就可以再次进入OSR编译方法。

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

回答

1

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

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

我无法详细了解您的特定情况,但从给出的描述中,我怀疑您的应用程序调用C1编译版本。方法的入口点永远不会设置为OSR编译的NMethod。

+0

是的,最后我没有重现它 - 后来运行的主要是显示热启动方法在启动后一秒钟左右就可以编译正常的非OSR C2(级别4),所以我不确定是什么起床了。也许这是LogCompilation输出中的一个小故障(例如,由PrintAssembly并发地写入?),因为_timing_似乎表明它正在运行OK。 – BeeOnRope

+0

你的意思是“在相同的字节码**索引**上面为...生成”吗? – BeeOnRope

+0

@BeeOnRope是的,谢谢你的纠正。 – apangin

相关问题