JIT 之方法内联

本文主要摘自周志明《深入理解 Java 虚拟机: JVM 高级特性与最佳实践》

什么叫方法内联?
方法内联就是把目标方法的代码“复制”到发起调用的方法之中,避免发生真实的方法调用。

方法内联有什么好处?
1). 消除方法调用的成本,如无需再建立新的栈帧;
2). 为其它优化手段建立良好的基础,如无用代码消除等。

Java 虚拟机中方法内联面临的难题。
Java 虚拟机中的内联过程没有想象的那么简单。我们知道,只有使用 invokespecial 指令调用的私有方法、实例构造器和父类方法,以及使用 invokestatic 调用的静态方法,顶多再加上用 final 修饰的方法,才是在编译期进行解析的,它们称为非虚方法。除此之外, Java 中的其它方法都称为虚方法,对它们的调用需要在运行时进行方法接受者的多态选择,并且都有可能存在多于一个版本的方法接收者。对于一个虚方法,编译期做内联的时候根本无法确定应该使用哪个方法版本,需要在运行期才能确定。这也是在 Java 虚拟机中做内联比较困难的原因。

难题的解决方案: CHA 技术、守护内联和内联缓存。
CHA ,类型继承关系分析。它是一种基于整个应用程序的类型分析技术,用于确定在目前已加载的类中,某个接口是否有多于一种的实现,某个类是否存在子类,子类是否为抽象类等。

猜你喜欢

转载自dsxwjhf.iteye.com/blog/2202075
JIT