逃逸分析
概念
分析指针动态范围的方法。
同步消除
经过逃逸分析后,发现一个类的变量有同步锁,但只有一个线程在访问它,那么逃逸分析后的机器码会去掉同步锁。
标量替换
标量:不可继续分解的数据类型,如int,long,char
聚合量:可继续分解的数据类型,如自定义的对象
若经过逃逸分析后,一个对象不会被外界访问(外界方法,外界对象),经过JIT优化,这个对象会被拆解成这个对象内部的若干个成员变量来代替,即为标量替换。
标量替换是jvm在栈上分配对象的基础。
实验
测试代码:
package JavaLearning;
class TestTime {
long startTime=System.nanoTime();
public long getTestTime(){
return System.nanoTime()-startTime;
}
}
public class EscapeAnalysis {
class Test {
int id;
String name;
public Test(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}
void takeExample(int i){
new Test(i,"name"+i);
}
public static void main(String[] args) {
EscapeAnalysis one=new EscapeAnalysis();
TestTime time=new TestTime();
for (int i = 0; i <100000000 ; i++) {
one.takeExample(i);
}
System.out.println(time.getTestTime());
}
}
关闭逃逸分析
使用IDEA运行java时,将下面语句复制到edit configurations窗口下的VM options区域
-XX:-DoEscapeAnalysis
结果(单位为ns):
开启逃逸分析
jdk6以上版本默认开启