美文网首页
java 方法内联

java 方法内联

作者: hellozepp | 来源:发表于2019-08-28 20:05 被阅读0次

1 内联概念:把函数调用的方法直接内嵌到方法内部,减少函数调用的次数

2 函数的调用过程: 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,
再返回到 转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要
恢复 现场,并按原来保存地址继续执行。也就是我们常说的压栈和出栈。

3 应用场景:当我们在调用频率很高的地方经常调用一个其他函数,但是函数体很小,函数频繁的函数跳转影响性能。这时候jvm
能够自动识别热点函数,到达阀值触发jit优化。对其进行内联。
public class tt {

                           public int add(int a,int b){
                           return a+b;}
                    public static void main(String[] args) {
                       tt t=new tt();
                        for (int i=0;i<1700;i++){
                           System.out.println(t.add(i,i));
                       }}

}

4 java内联配置
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)

5 方法内联的规则:
1 触发方法内联的规则: 1 自动拆箱总被内联
2 指令指定:-XX:CompileCommand中的inline指令指定的方法(c++);
3 注解指定:@ForceInline注解的方法;

     2 不触发方法内联的规则: 1:Throwable类的方法不能被其他类中的方法内联;
                                                 2:-XX:CompileCommand中dotinline或exclude指令指定的方法;
                                                 3:@Dontinline注解的方法;
                                                 4:调用字节码对应的符号引用未被解析;
                                                 5:目标方法所在的类未被初始化;
                                                 6:目标方法是native方法;
                                                 7:C2不支持内联超过9层的调用(-XX:MaxInlineLevel),以及1层的直接递归调用(- 
                                                       XX:MaxRecursIninleLevel)

相关文章

  • Java 方法内联

    什么是Java 方法内联? 我们先来看看普遍的内联函数含义。在维基百科中解释为: 内联函数:在计算机科学中,内联函...

  • java 方法内联

    1 内联概念:把函数调用的方法直接内嵌到方法内部,减少函数调用的次数 2 函数的调用过程: 调用某个函数实际上将...

  • JVM 中的方法内联(Method Inlining)

    简介 本章节,我们将研究Java虚拟机中的方法内联及其工作原理。 我们将学习如何从JVM中获取和读取与内联相关的信...

  • 方法内联

    JVM会自动的识别热点方法,并对它们使用方法内联优化。那么一段代码需要执行多少次才会触发JIT优化呢?通常这个值由...

  • C++ : 内联函数和引用变量,赶紧get一下

    一、内联函数 内联函数和普通函数的使用方法没有本质区别,我们来看一个例子,下面展示了内联函数的使用方法: #inc...

  • 第二十八篇: Swift属性

    函数内联 函数内联是一种编译器技术优化,它通过使用方法的内容替换直接调用该方法,从而优化性能。1)将确保有时内联函...

  • JVM代码优化:方法内联(Method inlining)

    什么是方法内联 方法内联,是指JVM在运行时将调用次数达到一定阈值的方法调用替换为方法体本身,从而消除调用成本,并...

  • Kotlin inline & infix

    inline 内联函数 调用内联函数时,在编译期间,被定义的内联函数体的代码将被拷贝至每个调用方法体内。 优点: ...

  • Kotlin - Inline Functions 1

    Inline Basics Inline or Inlining,我们更经常听到的词是方法内联或者内联函数。在大多...

  • kotlin的内联函数的使用

    kotlin的内联函数属于kotlin的高级特性了,也是不同于java的区别之一;至于为什么kotlin要使用内联...

网友评论

      本文标题:java 方法内联

      本文链接:https://www.haomeiwen.com/subject/aaamectx.html