如果我引用了一个类并在其上调用了一个方法,而这个类或方法是最终的,我的理解是编译器或JVM会用更便宜的静态分派替换动态分派,因为它可以准确地确定将调用哪个版本。
但是,如果我有一个对接口的引用,而接口当前只有一个实现者,而实现者是最终的,或者方法是最终的,那么JVM能否在运行时找出并优化这些调用呢?
发布于 2009-06-10 03:16:31
(在这里插入Knuth关于优化的引述。)
参见Wikis Home > HotSpot Internals for OpenJDK > PerformanceTechniques。
Inlining上有一些有趣的链接。
发布于 2009-06-11 20:16:05
AFAIK中,JVM最多可以内联两个方法,这些方法不必是最终的。如果方法很小并且经常被调用,它可以做到这一点。如果您的代码调用三个或更多方法,则只会调用最常调用的方法。
注1: JVM关心有多少个实现,只关心实际调用了多少个。
注2: JVM可以内联编译时不存在的方法,它是唯一重要的在运行时可用的代码。
发布于 2009-06-11 20:23:23
到目前为止,Java虚拟机不再关心"final“关键字(仅用于类断言)。一切都被认为是最终的,除非加载的类覆盖了指定的函数,或者在接口的情况下提供了它的另一个实现。
如果在JIT编译器已经编译了一些它认为是最终的东西之后,在运行时动态加载类,这将导致代码的多次编译,但其收益似乎是麻烦事。
我没有关于它的论文的链接,但我在几周前读到了它(可能它就像这样在Java7中)。
https://stackoverflow.com/questions/973504
复制相似问题