JIT的编译器分了两种:C1和C2,在HotSpot下对应Client和Server两类。(-client和-servcer指定)
C1和C2不同的优化策略
C1:方法内联、去虚拟化、冗余消除
方法内联:将引用的函数代码编译到引用点,尖山栈帧的生成,减少参数传递和跳转
去虚拟化:对唯一实现进行内联
冗余消除: 在运行期间把一些不会执行的代码折叠掉
C2:逃逸分析
标量替换:用标量值代替聚合对象的属性值
栈上分配:用于对未逃逸的对象分配对象在栈上,而不是堆
同步消除: 清楚同步操作,通常是指synchronized
总结:
- JIT编译出来的机器码比解释器执行效率高,但启动速度要慢一点
- C2比C1启动慢,但稳定下来后,C2速度远快于C1
补充:AOT编译器(静态提前编译器),它可以将java类文件直接转化为机器码。
- 好处:java虚拟机加载已经预编译好的二进制库,可以直接执行,不必等待及时编译器的预热
- 缺点:破坏了java一次编译到处运行。降低了java链接过程的动态性。还需要继续优化。