逃逸分析

mac2024-03-21  25

逃逸分析是JIT即时编译器中的一个重要的优化手段,动态的编译热点代码并进行逃逸分析,标量替换,锁消除优化代码,JDK1.8默认全部开启

逃逸分析:

分析对象动态的作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸

public static StringBuffer createStringBuffer1(String s1, String s2) { StringBuffer sb = new StringBuffer(); sb.append(s1); sb.append(s2); return sb; } public static String createStringBuffer2(String s1, String s2) { StringBuffer sb = new StringBuffer(); sb.append(s1); sb.append(s2); return sb.toString(); }

第一个方法sb对象逃逸了,第二个方法sb对象并没有

使用逃逸分析能够做到以下几点优化: 1、同步参数:方法中的同步的对象没有逃逸的话,就解除同步 2、标量替换:方法中对象没有逃逸并且该对象是一个聚合量,就将该对象拆分成标量 3、栈上分配:方法中未逃逸的对象,不一定在堆分配,有可能在栈中分配空间

标量替换:

标量是指一个无法再分解成更小的数据的数据。Java中的原始数据类型就是标量。相对的,那些还可以分解的数据叫做聚合量,Java中的对象就是聚合量,因为他可以分解成其他聚合量和标量 例:

public static void main(String[] args) { alloc(); } private static void alloc() { Point point = new Point1,2; System.out.println("point.x="+point.x+"; point.y="+point.y); } class Point{ private int x; private int y; }

优化后

private static void alloc() { int x = 1; int y = 2; System.out.println("point.x="+x+"; point.y="+y); }

锁消除:

同步块对象在方法中没有逃逸,所以取消同步

public void f() { Object hollis = new Object(); synchronized(hollis) { System.out.println(hollis); } }

优化后:

public void f() { Object hollis = new Object(); System.out.println(hollis); }
最新回复(0)