JVM方法内联和逃逸分析
作者:bin1.方法内联
是编译器优化的最重要的优化手段,内联的实现就是减少一次调用,将方法或者变量直接内联在当前方法中
未优化的代码:
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.逃逸分析
栈上分配:如果一个对象不会被其他线程访问到,那么就直接在当前线程的栈上分配内存,随着栈的出栈而销毁
标量替换:如果一个对象只用到其中一个属性,并且属性的值确定,那没有替换为该属性进行使用就可以量
同步消除:如果一个变量不会被其他线程访问,即未发生逃逸,那么就可以关闭他的同步逻辑。