内联缓存:是一种加快动态绑定的优化技术,能够缓存虚方法调用中调用者的动态类型以及该类型所对应的目标方法。在之后的执行过程中,如果碰到已缓存的类型,便会直接调用该类型所对应的目标方法;反之内联缓存则会退化至使用基于方法表的动态绑定
多态的三个术语:
- 单态 (monomorphic):指的是仅有一种状态的情况
- 多态 (polymorphic):指的是有限数量种状态的情况,二态(bimorphic)是多态的其中一种
- 超多态 (megamorphic):指的是更多种状态的情况,通常用一个具体数值来区分多态和超多态,在这个数值之下,称之为多态,否则称之为超多态
对于内联缓存来说,有对应的单态内联缓存、多态内联缓存:
- 单态内联缓存:只缓存了一种动态类型以及所对应的目标方法,实现简单,比较所缓存的动态类型,如果命中,则直接调用对应的目标方法。
- 多态内联缓存:缓存了多个动态类型及其目标方法,需要逐个将所缓存的动态类型与当前动态类型进行比较,如果命中,则调用对应的目标方法
为了节省内存空间,Java 虚拟机只采用单态内联缓存,没有命中的处理方法:
- 替换单态内联缓存中的纪录,类似于 CPU 中的数据缓存,对数据的局部性有要求,即在替换内联缓存之后的一段时间内,方法调用的调用者的动态类型应当保持一致,从而能够有效地利用内联缓存
- 劣化为超多态状态,这也是 Java 虚拟机的具体实现方式,这种状态实际上放弃了优化的机会,将直接访问方法表来动态绑定目标方法,但是与替换内联缓存纪录相比节省了写缓存的额外开销
虽然内联缓存附带内联二字,但是并没有内联目标方法