逃逸分析
2020-03-04 23:32
141 查看
逃逸分析是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 Point(1,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); }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐