一、逃逸分析
-
逃逸分析的作用:分析对象动态作用域。
-
逃逸分析的对象:方法中的变量。
-
逃逸分析的分类:
方法逃逸:一个对象在方法中定义后,他可能被外部方法所引用,譬如作为调用参数传递到其他方法中,称为方法逃逸。
线程逃逸:一个对象在方法中定义后,他可能被外部线程所访问,譬如赋值给类变量或可以在其他线程中访问到的实例变量,称为线程逃逸。
二、逃逸分析带来的优化
当证明一个对象不会逃逸到方法或者线程之外时,jvm可以为这个变量进行一些高效的优化:
-
栈上分配:如果确定一个对象变量不会方法逃逸,那么对象就会分配到栈空间,对象随着栈帧出栈而销毁。(大量对象随着方法的结束而自动销毁,可以减小GC系统的压力)
-
同步消除:如果确定一个对象变量不会线程逃逸,那这个变量读写就一定不会有竞争,对这个变量的同步措施就可以被消除掉。
-
标量替换:如果确定一个对象变量不会方法逃逸,且这个变量是聚合量,那jvm真正执行的时候将可能不创建这个对象,而改为创建它的若干个被这个方法使用到的成员变量(标量)来代替。
标量:指一个数据无法再分解成更小的数据,像Java中的基本数据类型:int 、long、reference等;
聚合量:指一个数据可以继续分解成其他数据,像封装多个属性的java对象;
注意:
-
逃逸分析技术不成熟在于:逃逸分析的性能收益不能保证高于逃逸分析的消耗
-
在Java代码运行时,通过JVM参数可指定是否开启逃逸分析
-XX:+DoEscapeAnalysis : 表示开启逃逸分析
-XX:-DoEscapeAnalysis : 表示关闭逃逸分析
从jdk 1.7开始已经默认开始逃逸分析,如需关闭,需要指定-XX:- DoEscapeAnalysis