Java是否通过一个标记为final的单个实现者的接口优化方法调用?

Uri*_*Uri 10 java performance

如果我有一个类的引用并在其上调用一个方法,并且该类或方法是最终的,我的理解是编译器或JVM将用更便宜的静态调度替换动态调度,因为它可以确切地确定哪个版本将被调用.

但是,如果我有一个接口的引用,并且接口当前只有一个实现者,并且该实现者是final或该方法在该实现者中是最终的,那么JVM能否在运行时找出并优化这些调用呢?

Eug*_*ota 11

(在此处插入关于优化的Knuth引用.)

请参阅Wiki Home> HotSpot Internals for OpenJDK> PerformanceTechniques.

  • 方法经常被内联.这增加了编译器的优化"范围".
  • 静态,私有,最终和/或"特殊"调用很容易内联.
  • 如果类层次结构允许,虚拟(和接口)调用通常会降级为"特殊"调用.如果进一步的类加载会破坏事物,则会注册依赖项.
  • 具有不平衡类型配置文件的虚拟(和接口)调用使用乐观检查进行编译,以支持历史上常见的类型(或两种类型).

Inlining有一些有趣的链接.