Java经过字节码和Java虚拟机(JVM)这种跨平台的抽象,屏蔽了操做系统和硬件的细节,这也是实现“一次编译,处处执行”的基础。
在运行时,JVM会经过类加载器(Class-Loader)加载字节码,解释或者编译执行。
主流Java版本中,如JDK 8实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。
一般运行在server模式的JVM,会进行上万次调用以收集足够的信息进行高效的编译,client模式这个门限是1500次。
Oracle Hotspot JVM内置了两个不一样的JIT compiler,C1对应前面说的client模式,适用于对于启动速度敏感的应用,好比普通Java桌面应用;
C2对应server模式,它的优化是为长时间运行的服务器端应用设计的。
默认是采用所谓的分层编译(TieredCompilation)。
Java虚拟机启动时,能够指定不一样的参数对运行模式进行选择。
好比,指定“-Xint”,就是告诉JVM只进行解释执行,不对代码进行编译,这种模式抛弃了JIT可能带来的性能优点。毕竟解释器(interpreter)是逐条读入,逐条解释运行的。
与其相对应的,还有一个“-Xcomp”参数,这是告诉JVM关闭解释器,不要进行解释执行,或者叫做最大优化级别。那你可能会问这种模式是否是最高效啊?简单说,还真未必。“-Xcomp”会致使JVM启动变慢很是多,同时有些
JIT编译器优化方式,好比分支预测,若是不进行profling,每每并不能进行有效优化。
除了咱们平常最多见的Java使用模式,其实还有一种新的编译方式,即所谓的AOT(Ahead-of-Time Compilation),直接将字节码编译成机器代码,这样就避免了JIT预热等各方面的开销,好比
Oracle JDK 9就引入了实验性的AOT特性,而且增长了新的jaotc工具。
Java字节码的设计充分考虑了JIT这一即时编译方式,能够将字节码直接编译成高性能的本地机器码。