方法内联
方法内联:
含义:把目标方法复制到发起调用的方法中,避免了真实的方法调用。
编译器最重要的优化手段之一。
优点:消除方法的调用成本。为其他优化手段建立良好的基础。
即时编译器做了一些努力,否则如果只是按照经典编译原理的优化理论(内联的方法时确定的),大多数方法无法进行内联。
因为虚方法的调用是在运行是才确定具体调用哪个方法。编译器无法确定调用具体的方法,只有运行才确定具体的方法。
为了解决这个问题,引入了“类型继承关系分析”CHA。用于确定目前已经加载的类中,某个接口是否有多于一种实现,某个类是否存在子类、子类是否为抽象类等信息。
对于非虚方法,直接内联。
对于虚方法,查询CHA,(关键点,证明虚方法是唯一的,profile得来的)
只有一个版本,进行内联。属于激进优化,预留逃生门。如果加载导致继承关系发生了变化的新类。抛弃已经编译的代码,返回解释执行。
多于一个版本,使用内联缓存。
内联缓存原理:没发生方法调用,缓存为空,当第一次调用发生后,缓存记录下方法接收者的版本信息。每次调用比较接收版本信息。一样,继续内联,不一样,找找虚方法表进行方法分派。
那具体是怎么做的呢?
即时编译器既可以在解析过程中替换方法调用字节码,也可以在 IR 图中替换方法调用 IR 节点。这两者都需要将目标方法的参数以及返回值映射到当前方法来

浙公网安备 33010602011771号