1.逃逸分析概念
是一种有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java虚拟机能够分析出一个新的对象的引用范围从而决定是否要将这个对象分配到堆上。
2.逃逸分析主要就是分析对象的动态作用域
基于逃逸分析,一个对象可能会被用作三种逃逸状态标记:
- 全局级别逃逸:一个对象可能从一个方法或者当前线程中逃逸。再明确一点,如果一个对象被作为一个方法的返回值,那么对象被标记为全局逃逸状态。
- 参数级别逃逸:如果一个对象被作为参数传递给一个方法,但是在这个方法之外无法访问或者对其他线程不可见,这个对象标记为参数级别逃逸。
- 无逃逸状态:一个对象不会产生逃逸。
3. 逃逸分析的作用
通过逃逸分析,在不存在逃逸下JVM可以进行以下优化:
- 同步消除。线程同步本身比较耗时,如果确定一个变量不会逃逸出线程,无法被其他线程访问到,那么这个变量的读写就不会存在竞争,对这个变量的同步措施可以清除。比如方法中有对象被方法外引用。
- 将堆分配转为栈上分配:在一般应用中,不会逃逸的局部对象占比很大,如果使用栈上分配,那大量对象会随着方法结束而自动销毁,减轻垃圾回收系统压力。
- 分离对象或标量替换:若一个数据已经分解到不能再小了,这种称为标量。如果可以再继续分解则称为聚合量。那么标量替换就是将一个java对象拆散,根据程序的访问情况,将其用到成员变量恢复为原始类型来访问,称为标量替换。如果逃逸分析证明一个对象不会被外部访问,并且这个对象可以被拆散的话,那么程序真正执行的时候可能在栈上创建若干个成员变量。