逃逸分析是为其他优化措施提供依据的分析技术
一个对象被定义后,做执行范围内,
如果被作为参数传递给其他方法,这种叫做方法逃逸;
如果运行被其他线程访问,这种称为线程逃逸。
对象的逃逸程度:不逃逸->方法逃逸->线程逃逸。
针对对象的逃逸程度的优化手段
1. 标量替换
对象是一个聚合量,由基本数据类型及reference类型等标量(无法继续分解的最小数据)组成。 如果一个对象不逃逸,就可以将对象拆解成基本数据类型及reference类型等标量,程序执行时可能不创建该对象,而是创建可以替代它的若干标量,分配和读写都会比较快。这种优化手段对对象逃逸程度要求很高,不允许对象逃逸出方法范围。
2. 栈上分配
我们知道对象几乎是在Java堆上分配,不再使用后被Java GC回收,回收动作无论是复制、标记清理还是标志整理都需要消耗处理器资源。如果确定一个对象不逃逸或者只逃逸出方法而不逃逸出线程,那么这个对象可以随着栈帧的创建分配在栈上,随着栈帧的出栈而销毁,这样垃圾收集子系统的压力会小很多。
3. 同步消除(锁消除)
如果确定一个对象不逃逸或者只逃逸出方法而不逃逸出线程,那么这个对象的读写肯定不会存在竞争,对这个变量的同步措施可以被消除。