写点什么

【Java 虚拟机】- Java 虚拟机之逃逸分析

用户头像
双木之林
关注
发布于: 2021 年 01 月 20 日
【Java虚拟机】- Java虚拟机之逃逸分析

逃逸分析

概念

  • 逃逸分析(Escape Analysis) 是目前Java虚拟机中比较前沿的优化技术, 它与类型继承关系分析一样, 并不是直接优化代码的手段, 而是为其他优化措施提供依据的分析技术

  • 开启参数:使用参数-XX: +DoEscapeAnalysis来手动开启逃逸分析,-XX: +PrintEscapeAnalysis来查看分析结果

基本原理

  • 分析对象动态作用域, 当一个对象在方法里面被定义后, 它可能被外部方法所引用

类型

  • 方法逃逸:作为调用参数传递到其他方法中

  • 线程逃逸:可能被外部线程访问到, 譬如赋值给可以在其他线程中访问的实例变量

  • 对象由低到高的不同逃逸程度:从不逃逸、 方法逃逸到线程逃逸

优化手段

  • 栈上分配(支持方法逃逸)

  • 标量替换

  • 同步消除

优化例子

	@Data	public class Point {		private int x, y;
private Point(int x, int y) { this.x = x; this.y = y; } } //未优化方法 public int test(int x) { int xx = x + 2; Point p = new Point(xx, 42); return p.getX(); }
//步骤1:构造函数内联后的样子 public int test(int x) { int xx = x + 2; // 在堆中分配P对象的示意方法 Point p = point_memory_alloc(); // Point构造函数被内联后的样子 p.x = xx; // Point::getX()被内联后的样子 p.y = 42 return p.x; }
// 步骤2: 标量替换后的样子 public int test(int x) { int xx = x + 2; int px = xx; int py = 42 return px; } // 步骤3: 做无效代码消除后的样子 public int test(int x) { return x + 2; }
复制代码

延伸:假如有人问,Java对象是否一定在堆中分配吗?答案:不是的,假如开启了逃逸分析,Java虚拟机会进行逃逸分析,那么假如满足其条件便会出现栈上分配的情况

用户头像

双木之林

关注

还未添加个人签名 2020.05.09 加入

互联网金融开发工程师

评论 (1 条评论)

发布
用户头像
2021 年 01 月 20 日 14:34
回复
没有更多了
【Java虚拟机】- Java虚拟机之逃逸分析