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