Java JIT何时内联方法调用?它是基于#times调用调用者方法(如果是,那个数字是多少?),还是其他一些标准(那会是什么?)
我读过 JIT 可以内联“最终”方法,但它也内联基于运行时统计的非最终方法,所以想知道触发条件是什么。
我猜答案会根据 JVM 实现而有所不同,但也许所有这些都有一些共同点?
简短的回答是随时随地。
很多时候,JITC 会自动内联小型最终或伪最终方法,而无需先收集任何统计信息。这是因为很容易看出内联实际上节省了代码字节而不是对调用进行编码(或者至少它几乎是“清洗”)。
除非统计数据表明它是值得的,否则通常不会内联真正的非最终方法,因为内联的非最终方法必须以某种方式“保护”,以防意外的子类出现。
至于在 JITCed 或内联之前可能调用的次数,这是高度可变的,即使在运行的 JVM 中也可能会发生变化。
运行服务器 Hotspot 编译器的 JVM 的默认内联阈值是 35 个字节码。
通常 JIT 默认只内联“小”方法。除此之外,它完全取决于实现。