【16】方法内联

  • 方法内联:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。方法内联只发生在即时编译器中,在即时编译中,即时编译器会将当前方法所包含的方法调用的目标方法纳入编译范围中

  • C2中,方法内联是在解析字节码的过程中完成的。每当碰到方法调用字节码时,C2将决定是否需要内联该方法调用。若需要内联,则解析目标方法的字节码。

  • 方法内联的影响
    内联越多,生成代码的执行效率越高;
    内联越多,编译时间越长(对即时编译器来说)。
    内联越多,生成的机器码越长,可能导致code cache已满,导致即时编译被关闭

  • 即时编译器不会无限制的进行内联

    • -XX:CompileCommand中的inline指令指定的方法,以及由@ForceInline注解的方法(仅限于JDK内部方法),会被强制内联
    • 若调用字节码对应的符号引用未被解析、目标方法所在的类未被初始化,或者目标方法是native方法,将导致方法无法内联
    • C2不止内联超过9层的调用,以及1层的直接递归调用
    • 即时编译器将根据方法调用指令所在程序路径的热度,目标方法的调用次数及大小,以及当前IR图的大小来决定方法调用能否被内联(即时编译器中的内联算法更青睐于小方法)
  • 静态方法调用:即时编译器可以轻易地确定唯一的目标方法;

  • 动态方法调用:即时编译器需要先对虚方法调用进行去虚化,即转换为一个或多个直接调用,然后才能进行方法内联

  • 去虚化

    • 完全去虚化:通过类型推导或者类层次分析,识别虚方法调用的唯一目标方法,从而将其转换为直接调用的一种优化手段。关键在于证明虚方法调用的目标方法是惟一的。
    • 条件去虚化:将虚方法调用转换为若干个类型测试及直接调用的优化手段。关键在于找出需要进行比较的类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值