• JIT内联优化


    最近改sonar问题,会对方法行数有限制,加上之前团队要求的尽量拆小方法等,回顾下内联优化。

    内联函数

    内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度。

    public newOrder(String company){
        String orderSn = this.genOrderSn(company);
        //...
    }
    
    private String genOrderSn(String company){
        return SnUtil.newSn(company);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    内联后

    public newOrder(String company){
        String orderSn = SnUtil.newSn(company);
        //...
    }
    
    • 1
    • 2
    • 3
    • 4

    好像跟IDEA直接ctrl + shift + n 一样,不过这个jit编译器在编译期才把这个在一起展开。

    什么时候内联

    Java不支持直接声明为内联函数的,如果想让他内联,只能够向编译器提出请求,最后是不是内联函数,是由编译器说了算。方法内联是由JIT编译器在运行时完成的,取决于一下几点:

    1:是否热点方法:当一个方法被调用超过一定次数,编译器会认为这是一个热点方法,从而进行内联优化。
    2:方法大小:过大的方法被Jit认为是不适合做内联的,这个数值由-XX:FreqInlineSize,默认是325b,大于这个大小的方法不考虑内联。
    3:唯一性:如果这个方法由多个实现,JIt无法确认具体调用的是哪一个方法,无法完成内联。例如protect,public方法被子类重载。

    和其他比较

    1. c++: 想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。
    2. kotlin: 也是可以通过加关键字 inline实现。

    小结

    1. private,static,final方法因为唯一性更有可能被编译器内联。
    2. 小方法更有可能被内联。
      通过对编译器内联的学习,可以知道在平时写代码过程中,把一个大方法按含义拆成多个private小方法,不会增加压栈出栈的负担,反而可以提升代码可读性,更好的利用jvm的内联优化。
  • 相关阅读:
    若依集成just-auth实现第三方授权登录
    java源码系列:HashMap底层存储原理详解——2、技术本质-原理过程-数据结构
    Centos升级Openssh版本至openssh-9.3p2
    jira自定义字段userpicker类型不能用
    linux系统中通配符与常用转义字符
    JAVA练习百题之求矩阵对角线之和
    【华为机试真题 JAVA】报数游戏-100
    简单的反弹shell到全交互式shell
    测试的重要性及目的
    容器管理工具 Docker生态架构及部署
  • 原文地址:https://blog.csdn.net/vipshop_fin_dev/article/details/132798312