即时编译JIT
目前主流的两款商用Java虚拟机(HotSpot、OpenJ9)里,Java程序最初都是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或者代码块的运行特别频繁,就会把这些代码认定为“热点代码”(Hot Spot Code),为了提高代码的执行效率,在运行时,虚拟机将会把这些代码编译成本地机器码,并以各种手段尽可能地进行代码优化,这个过程称为即时编译。
提前编译AOT
提前编译是相对于即时编译的概念,提前编译能带来的最大的好处是Java虚拟机加载这些已经预编译成二进制库之后就能直接调用,而无须再等待即时编译器在运行时将其编译成二进制机器码。理论上,提前编码可以减少即时编译带来的预热时间,减少Java应用长期给人带来的“第一次运行慢”的不良体验。坏处很明显,它破坏了Java“一次编写,到处运行”的承诺,必须为每个不同的操作系统、硬件去编译对应的发行包;也显著降低了Java链接过程的动态性,必须要求加载的代码在编译期就是全部已知的,而不能在运行期才确定,否则就只能舍弃掉已经提前编译好的版本,退回到原来的即时编译执行状态。