首页 > java > JVM方法内联和逃逸分析

JVM方法内联和逃逸分析

作者:bin

1.方法内联

是编译器优化的最重要的优化手段,内联的实现就是减少一次调用,将方法或者变量直接内联在当前方法中
未优化的代码:

public class Test extends TestB{
    public static  String data = "111";
    public static void main(String[] args) {
        new Test().doTest();

    }
    public  void doTest(){
        System.out.println(data);
    }
}

根据经典编译理论,大多数java方法其实是没办法,去做内联的,
先看下字节码

javap -verbose Test.class 

走的如下调用去,调用doTest(),获取data变量走的是引用去获取

  
0: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
3: getstatic     #6                  // Field data:Ljava/lang/String;
5: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V

我们做如下修改加上final

public final static  String data = "111";

看下字节码,发现是直接指向字符串的地址了,即进行了内联

0: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc           #6                  // String 111
5: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V

2.逃逸分析
栈上分配:如果一个对象不会被其他线程访问到,那么就直接在当前线程的栈上分配内存,随着栈的出栈而销毁
标量替换:如果一个对象只用到其中一个属性,并且属性的值确定,那没有替换为该属性进行使用就可以量
同步消除:如果一个变量不会被其他线程访问,即未发生逃逸,那么就可以关闭他的同步逻辑。

您必须 [ 登录 ] 才能发表留言!