即时编译(Just In Time,简称JIT)是一种通过在运行时将字节码翻译成机器码,从而改善字节码编译语言性能技术。逃逸分析并不是直接的优化手段,而是一个代码分析,通过动态分析对象的作用域,为其他优化手段,如同步消除、栈上分配和标量替换等提供依据。

        发生逃逸行为的情况有两种:方法逃逸和线程逃逸;

        方法逃逸:当一个对象在方法中定义之后,作为参数传递到其他方法中。

        线程逃逸:如类变量或者实例变量,可能被其他线程访问到。

        如果没有发生逃逸,JVM就会对代码进行优化。优化方法:

        1、同步消除:

         线程同步本身比较消耗性能,如果确定一个对象不会逃逸出线程,无法被其他线程访问到,该对象的读写就不存在竞争,因此可以消除该对象的同步锁。

        2、标量替换:

        标量是指不可分割的量,如java中的基本数据类型和引用类型;相对的一个数据可以继续分解,称为聚合量。把一个对象拆散,将其成员变量恢复到基本类型来访问就叫做标量替换。如果逃逸分析发现一个对象不会被外部访问,并且该对象可以被拆散,那么经过优化后,并不直接生成改对象,而是在栈上创建若干个成员变量。

        3、栈上分配:

        顾名思义,即是栈上分配对象。一般情况下,对象是在堆中分配的,没有发生方法逃逸的对象,在栈上分配的效率更高。执行完毕后,释放栈的资源,对象被销毁,就不用等到垃圾回收。真正的实现策略:并不会在栈上创建对象,而是利用了标量替换的原理。