- 什么是方法内联
a. 编译过程遇到方法调用,把目标方法体纳入编译范围且取代原方法优化手段
b. 是编译优化最重要的 - 举例:getter/setter
a. 如果没有方法内联,调用时需要创建并压入用于getter/setter的栈帧,访问字段,弹出栈帧,最后再到当前方法执行
b. 内联后,就仅剩字段访问 - 内联的条件
a. 内联越多执行效率越高,但是编译时间会延长
b. 内联越多,机器码越长容易使java内存溢出
下面举一个例子:
有这样一段代码
他的原始IR图为这样:
优化bar方法IR图为:
最后将bar方法IR图加入invoke5号节点中:
这就是JVM中简单的方法内联,当然方法内联还有很多限制,执行规则如下表所示: