关键字final是否会对JVM产生任何影响?

SPI*_*984 9 java performance multithreading jvm

现在,我最近提出了一个建议,你应该尽可能宽地使用关键字final.这是好的,以防止程序员射击他自己的腿 - 也就是说,重新分配不应重新分配的变量.

但是,它是否有任何其他目标?也就是说,JVM可以使用有关最终变量的信息以便以某种方式优化字节码,因此它运行得更快(构建更好的流水线或在多线程环境中使用它)?或者只是一种语法糖,可以最大限度地减少代码开发过程中出错的可能性?

das*_*ght 5

就变量而言,Java 足够聪明,可以确定变量在方法中的任何位置都没有发生更改,并将这些知识用于优化目的。它不需要您标记变量final才能知道这一点。

方法的情况略有不同:当您标记方法时final,Java 可以更快地调用此类方法,因为它不再需要检查其覆盖。尽管如此,hotspot 仍然足够聪明,可以发现无论使用或不使用final.

不过,一般来说,此建议旨在使您的代码更易于其他人阅读和理解:将变量设置为 Final 会告诉读者您正在设置常量;将类设为 Final 会告诉读者该类不是为继承而设计的;将方法设为 Final 会告诉读者该方法的逻辑应该在整个继承层次结构中保持不变。从长远来看,这些信息比优化正在运行的代码的潜力更有价值。


MKo*_*sch 5

IBM 声明:

就像许多关于 Java 性能的神话一样,人们普遍认为将类或方法声明为最终结果会带来更好的性能,但很少有人对此进行检验。争论的焦点是,将方法或类声明为 Final 意味着编译器可以更积极地内联方法调用,因为它知道在运行时这肯定是要调用的方法的版本。但这根本不是事实。仅仅因为类 X 是针对最终类 Y 编译的,并不意味着将在运行时加载相同版本的类 Y。因此编译器无法安全地内联此类跨类方法调用,无论是否是最终的。只有当一个方法是私有的时,编译器才能自由地内联它,在这种情况下,final关键字将是多余的。