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。