JIT编译器全名 just in time compile 也就是即时编译器,把经常运行的代码作为“热点代码”编译成与本地平台相关的机器码,进行各层次的优化。JIT编译器除了有缓存的功能外,还会对代码进行各种优化,包括逃逸分析、锁消除、锁膨胀、方法内联、空值检查消除、类型检查消除异己公共子表达式消除等。
逃逸分析:
逃逸分析的基本行为就是分析对象动态作用域,当一个对象在方法中被定义之后,他可能会被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。
JIT编译器的优化包括如下:
同步省略:也就是锁消除,当JIT编译器判断不会发生并发问题,那么会将synchronize去掉
标量替换:
标量(scalar):是指一个无法再分解成更小的数据的数据。Java中原始数据类型就是标量。
聚合量(aggregate):是指还可以分解的数据。Java中的对象就是聚合量,因为他可以分解成其他聚合量和标量。
在JIT阶段,如果经过逃逸分析,发现一个对象不会被外界访问的话,那么经过JIT优化,就会把这个对象拆解成若干个其中包含的若干个成员变量来代替。这个过程就是标量替换。
标量替换的好处就是对象不用在堆内存进行分配,为栈上分配提供了良好的基础。
那么逃逸分析技术存在哪些缺点呢?
技术不是特别成熟,分析过程很耗时,如果没有一个对象是不逃逸的,那么久得不偿失了。