在运行时,JVM会通过类加载器(Class-Loader)加载字节码,解释或者编译执行。JDK8实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。
通常运行在server模式的JVM,会进行上万次调用以收集足够的信息进行高效的编译,client模式这个门限是1500次。
Oracle Hotspot JVM内置了两个不同的JIT compiler,C1对应前面的client模式,适用于对于启动速度敏感的应用,如普通Java桌面应用;C2对应server模式,它的优化是为长时间运行的服务器端应用设计的。默认是采用所谓的分层编译。
Java虚拟机启动时,可以指定不同的参数对运行模式进行选择。
比如,指定-Xint,就是告诉JVM只进行解释执行,不对代码进行编译,这种模式抛弃了JIT可能带来的性能优势。因为解释器是逐条读入,逐条解释运行的。
-Xcomp,是告诉JVM关闭解释器,不要进行解释执行,或者叫做最大优化级别。会导致JVM启动变慢非常多,同时如果不进行profiling,往往不能对JIT编译器进行有效优化。
AOT(Ahead-of-Time Compilation),新的编译方式,直接将字节码编译成机器码,这样就避免了JIT预热等各方面的开销,比如Oracle JDK9就引入了实验性的AOT特性,并且增加了新的jaotc工具。