内联方法由JIT编译器执行,而不是javac.
现代JIT编译器(包括Hotspot)通常可以内联甚至非最终方法,必要时"适当地"撤销优化.他们基本上是聪明的.
简而言之:它完全取决于VM.在我看来,你应该根据产生最干净代码而不是性能的方法来使你的方法成为最终方法.我个人是"继承设计或禁止它"的粉丝,但这是一个不同的讨论:)
有趣的问题促使我进一步研究它。我发现了 2 条有趣的评论 -
与许多提示的含义相反,编译器无法安全地内联声明为 Final 的方法,因为该方法在运行时可能有非 Final 声明。
要了解原因,假设编译器查看类 A 和子类 B 以及子类 C,并在 A 中看到一个最终方法,该方法内联到 C 中。但是在运行时为 A 和 B 加载的版本不同,并且该方法是A 中不是最终的,并且 B 中被覆盖。然后 C 使用错误的内联版本。时间
而且,更权威一点,来自太阳白皮书,写方法可以保留虚拟,
由于 Java HotSpot VM 可以自动内联绝大多数虚拟方法调用,因此这种性能损失大大减少,在许多情况下甚至完全消除。
这是关于该机制的更直接的参考。
| 归档时间: |
|
| 查看次数: |
2161 次 |
| 最近记录: |