我正在阅读HotSpot VM应用的优化技术并找到this presentation by Oracle,其中列出了HotSpot VM尝试内联方法调用时的三个可能条件:
- 虚拟化(证明那里只有一种目标方法)
- 单态内联缓存
- 配置文件驱动的内联缓存
醇>
通过搜索互联网,我相信我明白这意味着以下内容:
VM"证明"一个类型当前没有子类型。因此,虚拟方法调用可以转换为非虚拟方法,允许内联方法的代码。添加了一个保护条件,检查在执行内联后没有加载子类型。
观察到在特定呼叫站点上始终在单个类型上调用方法。 (额外问题:Java是否支持多态内联缓存?)这允许执行乐观内联,其中保护条件检查类型是否不是缓存中表示的类型。
我找不到那是什么。
我的问题是:内联方法调用还有其他主要原因吗?我的研究是否正确?什么是配置文件驱动的内联缓存?
答案 0 :(得分:2)
一个类有多少个子类并不重要,唯一重要的是可以从给定的代码行调用多少个方法。例如一个方法可以在四个类中有两个实现,但如果只调用一个,那就好像方法只有一个实现。
根据可以调用的实现数量了解成本。 Performance of inlined virtual method invocations in Java
基于实际调用的方法,配置文件驱动的内联可能是内联的。