假设我有以下课程:public class MyClass { public void doSomething() { System.out.println("doing something."); }}让我们进一步假设,我的项目所做的就是调用该.something()方法。没有压倒一切或任何其他有趣的事情发生。MyClass myObj = new MyClass();myObj.doSomething();编译器是否javac注意到此方法调用未被覆盖,并将绑定优化为“早期绑定”?我是出于好奇才问的;在任何实际应用程序中,我当然会在我的代码中散布final、static和private。
1 回答
炎炎设计
TA贡献1808条经验 获得超4个赞
字节码编译器(如javac
)通常不会对实例方法调用进行早期绑定:
单独编译类的 Java 模型意味着这种优化只能在类调用其方法之一时应用。(如果
javac
假设跨类进行早期绑定,更改和重新编译一个类可能会导致绑定不正确。)没有太多价值,因为 JIT 编译器(或 AOT 编译器生成器)是执行大多数优化的地方。
现代 JVM 中的 JIT 编译器根据已加载的完整类集(到目前为止)进行广泛的优化。这包括优化方法调度和内联方法调用。此外,JIT 编译器足够智能,可以跟踪关键优化,并在动态加载新类等导致先前优化无效时重新编译。
添加回答
举报
0/150
提交
取消