Skip to content

JIT的编译器分了两种:C1和C2,在HotSpot下对应Client和Server两类。(-client和-servcer指定)

C1和C2不同的优化策略

C1:方法内联、去虚拟化、冗余消除

  • 方法内联:将引用的函数代码编译到引用点,尖山栈帧的生成,减少参数传递和跳转

  • 去虚拟化:对唯一实现进行内联

  • 冗余消除: 在运行期间把一些不会执行的代码折叠掉

C2:逃逸分析

  • 标量替换:用标量值代替聚合对象的属性值

  • 栈上分配:用于对未逃逸的对象分配对象在栈上,而不是堆

  • 同步消除: 清楚同步操作,通常是指synchronized

总结:

  • JIT编译出来的机器码比解释器执行效率高,但启动速度要慢一点
  • C2比C1启动慢,但稳定下来后,C2速度远快于C1

补充:AOT编译器(静态提前编译器),它可以将java类文件直接转化为机器码。

  • 好处:java虚拟机加载已经预编译好的二进制库,可以直接执行,不必等待及时编译器的预热
  • 缺点:破坏了java一次编译到处运行。降低了java链接过程的动态性。还需要继续优化。

Released under the MIT License.