您的位置:首页 > 其它

逃逸分析

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);
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
Hammond_ 发布了42 篇原创文章 · 获赞 1 · 访问量 244 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: