out-of-line call 是什么意思?

What does an out-of-line call mean?

提问人:Shankha057 提问时间:10/4/2021 更新时间:10/4/2021 访问量:93

问:

我正在阅读有关 Java 中值对象的 JEP 文档,并在对象标量化的上下文中在动机部分遇到了一行,如下所示:

有一些优化可以消除某些代码区域中的对象分配。例如,如果可以成功执行转义分析,则有时可以将对象“标量化”到其组件字段中。但是,这种优化在范围和适用性上是有限的。对于行外调用,只要强制执行现有的 Java 引用语义,就必须将对象装箱到内存中

我从这篇文章的答案中得到了关于这里所说的优化的想法。

我无法理解的部分在 JEP 中,作者所说的线外调用是什么意思?什么可以是一个很好的例子?

为了简明扼要,我理解了这样一个事实,即如果对象的作用域没有离开方法,Hotspot 将展开对象的字段并将它们分配到方法堆栈中。
什么样的代码看起来像线路外调用

java jvm-热点 转义分析 堆栈分配

评论

2赞 Stephen C 10/4/2021
out-of-line 意味着与in-line相反......我认为。代码在字节码级别看起来没有任何不同。这完全取决于 JIT 编译器是否内联了它。
0赞 Shankha057 10/4/2021
@StephenC 如果字节码看起来完全相同,比如说两种(略微)不同类型的人类可读代码,那么 JIT 将如何计算内联策略?对我来说似乎有点违反直觉。
0赞 Stephen C 10/4/2021
JIT 编译器根据方法的大小等因素来决定是否内联。阈值是可调整和可调的。我建议你自己研究一下。
0赞 Shankha057 10/4/2021
是的,这是真的。假设我有两个方法,每个方法的字节码长度为 30 行。JIT如何知道哪个是内联的,哪个不是?基本上,除了方法大小、对象范围和所附的 SO 帖子中提到的其他迹象之外,JIT 还关注哪些迹象?基本上,就非常简单的例子而言,就 Java 代码而言,像离线调用这样的东西会是什么样子?
1赞 apangin 10/4/2021
查看 stackoverflow.com/a/67797688/3448419

答: 暂无答案