编译优化方案
一、方法内联:消除方法调用成本(方法调用需要创建方法栈)。
class B {
int i;
int get(){
return i;
}
}
public void test() {
y = b.get();
z = b.get();
sum = y+z;
}
test方法优化为:
public void test(){
y=b.i;
z=b.i;
sum=y+z;
}
二、逃逸分析:当一个对象在方法中定义后,它可能被外部方法所引用,例如作为调用的参数传递到其它的方法中,称为方法逃逸。甚至还有可能被外部线程访问到,譬如赋值给类变量,称为线程逃逸。
1、对象的栈上分配
如果确定一个对象不会进行逃逸,那么该对象创建的时候,就会在栈上进行。对象的内存空间(生死)随着栈帧的生命周期。无需进行MGC就可以回收对象的内存。
2、同步消除
由于方法栈是线程私有的,如果确定对象不会逃逸,那么方法内的锁会被优化掉。
3、标量替换
标量:原始数据类型(int,long……)以及reference类型。
聚合量:多个标量组合成的类型。(也就是一般的POJO类)
如果证明一个对象不会逃逸,那么在使用该对象的时候,会拆分为相应的标量,而不创建该对象。