JVM JIT 优化

  • JIT 优化

    在本章中,我们将学习有关JIT优化的知识。
  • 方法内联

    在这种优化技术中,编译器决定将您的函数调用替换为函数体。以下是相同的示例-
    
    int sum3;
    
    static int add(int a, int b) {
       return a + b;
    }
    
    public static void main(String…args) {
       sum3 = add(5,7) + add(4,2);
    }
    
    //after method inlining
    public static void main(String…args) {
       sum3 = 5+ 7 + 4 + 2;
    }
    
    使用这种技术,编译器可以节省机器执行任何函数调用的开销(它需要将参数压入和弹出到堆栈中)。因此,生成的代码运行速度更快。 方法内联只能用于非虚拟函数(未被覆盖的函数)。考虑如果子类中重写了“add”方法,并且直到运行时才知道包含该方法的对象的类型,将会发生什么。在这种情况下,编译器将不知道内联哪种方法。但是,如果将该方法标记为“ final”,则编译器将很容易知道它可以是内联的,因为它不能被任何子类覆盖。注意,不能保证final方法总是内联的。
  • 消除无法访问的死代码

    无法访问的代码是任何可能的执行流程都无法访问的代码。我们将考虑以下示例-
    
    void foo() {
       if (a) return;
       else return;
       foobar(a,b); //无法访问的代码,编译时错误
    }
    
    死代码也是无法访问的代码,但是在这种情况下,编译器确实会爆出错误。相反,我们只是收到警告。每个代码块,例如构造函数,函数,try,catch,if,while等,对于在JLS(Java语言规范)中定义的不可访问代码都有各自的规则。
  • 不断折叠

    要了解不断折叠的概念,请参见以下示例-
    
    final int num = 5;
    int b = num * 6; //编译时常量num从不更改
    //编译器会给b赋值30。