我分析了在JITWatch中运行的基准测试的HotSpot日志,并注意到由于“无静态绑定”,许多方法调用未被内联。这些似乎仅发生在对默认接口方法的调用上。
我的问题是,默认接口方法是否会阻止JIT编译器内联它们的调用?
interface A {
default double a() {
return Math.random();
}
}
interface B extends A {
default double b() {
return a();
}
}
class C implements B {
public double c() {
double c = 0;
for (int i = 0; i < 1_000_000; ++i) {
c += b();
}
return c;
}
public static void main(String[] args) {
System.out.println(new C().c());
}
}
通过 JITWatch 进一步检查,似乎这个问题涉及默认接口方法调用其他默认接口方法。考虑到“没有静态绑定”消息,这更有意义。