zoukankan      html  css  js  c++  java
  • Java方法内联

    一、概念
    方法内联就是把调用方函数代码"复制"到调用方函数中,减少因函数调用开销的技术
     
    函数调用过程
    1、首先会有个执行栈,存储它们的局部变量、方法名、动态连接
    2、当一个方法被调用,一个新的栈帧会被加到栈顶,分配的本地变量和参数会存储在这个栈帧
    3、跳转到目标方法代码执行
    4、方法返回的时候,本地方法和参数被销毁,栈顶被移除
    5、返回原来的地址执行
     
    注:这就是通常说的函数调用的压栈和出栈过程,因此,函数调用需要有一定的时间开销和空间开销,当一个方法体不大,但又频繁被调用时,这个时间和空间开销会相对变得很大,变得非常不划算,同时降低了程序的性能。根据二八原则,80%的性能消耗其实是发生在20%的代码上,对热点代码的针对性优化可以提升整体系统的性能
     
    二、方法内联的原理
    就如上面所说,就是把调用方函数代码"复制"到调用方函数中
     
    看如下例子:
    private int add2(int x1 , int x2 , int x3 , int x4) {
    return add1(x1 , x2) + add1(x3,x4);
    }
     
    private int add1(int x1 , int x2) {
    return x1 + x2;
    }
    

      

     
    运行一段时间后,代码被内联翻译成:
    private int add2(int x1 , int x2 , int x3 , int x4) {
    //return add1(x1 , x2) + add1(x3,x4);
    return x1 + x2 + x3 + x4;
    }
     
    三、方法内联的条件
    JVM会自动的识别热点方法,并对它们使用方法内联优化。那么一段代码需要执行多少次才会触发JIT优化呢?通常这个值由-XX:CompileThreshold参数进行设置:
      使用client编译器时,默认为1500;
        使用server编译器时,默认为10000;
    但是一个方法就算被JVM标注成为热点方法,JVM仍然不一定会对它做方法内联优化。其中有个比较常见的原因就是这个方法体太大了,分为两种情况。
       如果方法是经常执行的,默认情况下,方法大小小于325字节的都会进行内联(可以通过** -XX:MaxFreqInlineSize=N**来设置这个大小)
           如果方法不是经常执行的,默认情况下,方法大小小于35字节才会进行内联(可以通过** -XX:MaxInlineSize=N **来设置这个大小)
     
    我们可以通过增加这个大小,以便更多的方法可以进行内联;但是除非能够显著提升性能,否则不推荐修改这个参数。因为更大的方法体会导致代码内存占用更多,更少的热点方法会被缓存,最终的效果不一定好。
     
    JVM参数:(-XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining)
    当我们执行1000次
     
    当我们执行10001次
     
    四、内联的隐藏条件
     
    虽然JIT号称可以针对代码全局的运行情况而优化,但是JIT对一个方法内联之后,还是可能因为方法被继承,导致需要类型检查而没有达到性能的效果
    想要对热点的方法使用上内联的优化方法,最好尽量使用final、private、static这些修饰符修饰方法,避免方法因为继承,导致需要额外的类型检查,而出现效果不好情况。
     
    五、结论
     
    1、针对热点方法,想要通过JIT内联优化来提升性能的建议 
    2、更小的方法体,JVM总是偏好更小的方法。
    3、尽量使用final、private、static修饰符
    4、使用+PrintInlining参数校验效果(【PrintInlining】-XX:+UnlockDiagnosticVMOptions必须配合参数{2}使用,并且只能加在其后才能生效)

  • 相关阅读:
    Netty3实现服务端和客户端
    Nio实现服务端
    python学习笔记8-邮件模块
    python学习笔记8-异常处理
    python学习笔记8--面向对象编程
    python番外篇--sql注入
    python学习笔记7-网络编程
    python学习笔记7-excel操作
    python学习笔记6--双色球需求实现
    python学习笔记6--操作redis
  • 原文地址:https://www.cnblogs.com/xyz-star/p/10152564.html
Copyright © 2011-2022 走看看