Java:JIT方法内联

2022-09-03 05:15:47

Java JIT 何时内联方法调用?它是基于调用方方法#times(如果是,该数字会是什么?),还是基于其他一些标准(那会是什么?)

我已经读到JIT可以内联“最终”方法,但它也基于运行时统计信息内联非最终方法,所以想知道触发标准是什么。

我想答案会根据JVM实现而有所不同,但也许所有这些答案都有一些共同点?


答案 1

简短的答案是随时。

通常,JITC会自动内联小型最终或伪最终方法,而无需首先收集任何统计信息。这是因为很容易看出内联实际上节省了代码字节而不是对调用进行编码(或者至少它几乎是“清洗”)。

除非统计数据表明这是值得的,否则通常不会内联真正的非最终方法,因为内联的非最终方法必须以某种方式“保护”,以防意外的子类通过。

至于在JITCed或内联之前可以调用某些东西的次数,这是高度可变的,即使在正在运行的JVM中也可能有所不同。


答案 2

运行服务器 Hotspot 编译器的 JVM 的默认内联阈值为 35 字节码。

官方文档


推荐