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

标签 java performance jvm jit jvm-hotspot

我明白了 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/

相关文章:

java - 可以设置 if 语句来搜索文本文件中的特定模式吗?

java - 使用记事本程序、JMenu、JPanel 的建议

sql - 准备好的语句中 where = ?, where in (?) 子句的最佳实践?

java - Unirest 异步请求阻止 JVM 退出

java - 在 Windows 64 上以 32 位模式运行 java

java - 使用别名参数名称来接受 Url 编码表单数据值

c++ - Boost MultiIndex Container,如何为快速插入做延迟索引?

performance - 非常奇怪-添加复合索引会使查询变慢(MongoDB)

tomcat - 增加 Eden 空间堆大小 tomcat

Java 内存感知缓存