- java语言是半编译半解释型语言,首先将.java文件编译成.class文件,这个叫前端编译,也是java跨平台的原因,各个操作系统都有对应的jvm将.class文件转化为机器码来执行,由.class转化为机器码的过程中,可以在程序执行前,用aot技术(jdk9引入的)直接将字节码编译为机器码,这样就避免了JIT预热等各方面的开销,AOT可以节省启动时间。如果不采用AOT技术,程序在执行后,先由解释器逐行将字节码解释执行,这里还引入了JIT即时编译器,来将一些热点代码直接编译成机器码,供之后使用,大大加快了java语言的执行效率,但是jit需要预热,因为它不知道哪些代码是热点代码。
- 最后来说说为什么不全部使用AOT,长话短说,这和 Java 语言的动态特性有千丝万缕的联系了。举个例子,CGLIB 动态代理使用的是 ASM 技术,而这种技术大致原理是运行时直接在内存中生成并加载修改后的字节码文件也就是
.class文件,如果全部使用 AOT 提前编译,也就不能使用 ASM 技术了。为了支持类似的动态特性,所以选择使用 JIT 即时编译器。