为了账号安全,请及时绑定邮箱和手机立即绑定

Java 编译器可以为非静态方法做早期绑定吗?

Java 编译器可以为非静态方法做早期绑定吗?

一只名叫tom的猫 2023-03-17 13:48:48
假设我有以下课程: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)通常不会对实例方法调用进行早期绑定:

  1. 单独编译类的 Java 模型意味着这种优化只能在类调用其方法之一时应用。(如果javac假设跨类进行早期绑定,更改和重新编译一个类可能会导致绑定不正确。)

  2. 没有太多价值,因为 JIT 编译器(或 AOT 编译器生成器)是执行大多数优化的地方。

现代 JVM 中的 JIT 编译器根据已加载的完整类集(到目前为止)进行广泛的优化。这包括优化方法调度和内联方法调用。此外,JIT 编译器足够智能,可以跟踪关键优化,并在动态加载新类等导致先前优化无效时重新编译。


查看完整回答
反对 回复 2023-03-17
  • 1 回答
  • 0 关注
  • 71 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信