微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java Finals是否有助于编译器创建更有效的字节码?

如何解决Java Finals是否有助于编译器创建更有效的字节码?

如果使用final字节码,效率不会明显提高,因为Java字节码编译器通常不会进行优化。效率奖励(如果有)将在JIT编译器1生成的本机代码中。

从理论上讲,使用会final为JIT编译器提供提示,以帮助其进行优化。实际上,最新的HotSpot JIT编译器可以忽略提示,从而做得更好。例如,现代的JIT编译器通常执行全局分析,以找出给定的方法调用是否是在应用程序当前加载的类的上下文中对叶方法调用。这种分析比您的final提示更准确,并且运行时甚至可以检测到何时加载了使分析无效的新类……并为受影响的代码重做分析和本机代码生成

使用以下其他语义后果final

  • 将变量声明为as final可以防止意外更改它。(并向读者表达您的意图。)
  • 方法声明为final防止在子类中重写。
  • 将类声明为as final可以防止完全子类化。
  • 将字段声明为as final阻止子类对其进行更改。
  • 将字段声明为final对线程安全有重要影响;参见JLS 17.5

在适当的情况下,这些都可以。但是,很明显,它们通过创建子类来限制重用的选项。在决定是否使用时需要考虑这一点final

因此,优良作法是用来final(广义上)表达您的设计意图,并实现所需的其他语义效果。如果final仅将其用作优化提示,那么您将不会取得太大成就。

有一些例外情况final 可能 导致某些平台上的性能有所改善。

  • 在某些情况下,将字段声明为会final更改字节码编译器处理该字段的方式。我在上面举了一个例子。另一个是“常量变量”的情况下(JLS 4.12.4),其中一个static final字段的值 将被 由字节代码编译器都在当前类,并且在其它类内联,这可能会影响代码的观察到的行为。(例如,引用常量不会触发类初始化。因此,添加a final 可能会 更改类初始化的顺序。)

  • 可以想象,将字段或局部参数声明为final可能允许进行JIT编译器的次优优化,否则该优化将无法完成。然而,可以声明为final的任何领域 可能 也被推断为通过JIT编译器有效决赛。(尚不清楚JIT编译器实际上会执行此操作,以及是否会影响生成的本机代码。)

但是,底线保持不变。您应该使用它final来表达设计意图,而不是作为优化提示

1-此答案假定我们正在谈论具有良好JIT或AOT编译器的最新JVM。1)最早的Sun Java实现根本没有JIT编译器。2)早期的Android Java实现使用的编译器在优化方面做得很差。实际上,早期的Android开发人员文档建议采取各种源代码级的微优化来弥补这一不足。此建议已被删除

解决方法

根据您将 final_修饰符应用于什么,它在java中会有不同的结果。我想知道的是,它是否_还能 帮助编译器创建更有效的字节码。我想这个问题深入到JVM如何工作,并且可能是特定于JVM的。

因此,以您的专业知识,以下任何一项对编译器有帮助吗?还是仅出于正常的Java原因而使用它们?

  • 期末课程
  • 最终方法
  • 最终领域
  • 最终方法参数

谢谢!

编辑:感谢您的所有答案!请注意,正如@Zohaib所建议的,我的问题是this的重复。发布前我的搜索不够好。我不会删除它,因为你们做出了很大的贡献,但是答案可以合并。除非另有说明,否则我将决定“关闭投票”系统。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。