一、JIT即时编译器 (Just In Time Compiler)
由于解释器在设计和实现上非常简单,且相当低效。为了解决这个问题,JVM提供了即时编译技术:即时编译可以将整个函数体编译成为机器码,有效到避免函数体被解释执行,而是重复执行时(即热点代码)直接执行编译后的机器码即可,大大提示了执行效率。
二、JIT的逃逸分析(Escape Analysis)
逃逸分析是一种代码分析手段,动态分析创建对象的使用范围。
1、内存逃逸
如果一个在方法中创建的对象 ,除了在方法体中还有方法外部的引用,那么在方法执行完之后,由于对象仍有被引用,所以 GC 有可能是无法立即回收的,此现象则是对象发生了逃逸。可以简单理解一个对象并不只存活在一个方法的作用域内。
逸行为的情况有两种:方法逃逸和线程逃逸。
- 方法逃逸:当一个对象在方法中定义之后,作为参数传递到其它方法中;
- 线程逃逸:如类变量或实例变量,或方法返回对象,可能被其它线程访问到;
public class EscapeAnalysis {
public static Object a;
public Object b;
public void globalVariableEscape(){
a = new Object(); // 静态变量,外部线程可见,会发生逃逸
}
public void instanceObjectEscape(){
b = new Object(); // 赋值给堆中实例字段,外部线程可见,会发生逃逸
}
public Object returnObjectEscape(){
return new Object(); // 返回实例,外部线程可见,会发生逃逸
}
public void noEscape(){
Object noEscape = new Object(); // 仅创建线程可见,对象无逃逸
}
}
2、逃逸分析的作用
筛选出没有发生逃逸的对象,为其它优化手段如栈上分配、标量替换和同步消除等提供依据