1.2.4 Java虚拟机
Java 技术的核心就是 Java 虚拟机( JVM, Java Virtual Machine),因为所有的 Java 程序都运行在 Java 虚拟机内部。 JVM 之所以被称之为 VM,是因为它是由一组规范所定义出的抽象计算机。 JVM 的主要任务就是负责将字节码装载到其内部,解释/编译为对应平台上的机器指令执行,如图 1-3 所示。
Sun 公司的 HotSpot VM 应该是大多数开发人员最熟悉的一款高性能 Java 虚拟机,它是JDK 和 OpenJDK 中缺省自带的一款虚拟机,同样也是目前市面上应用最广的一款 Java 虚拟机。但这款虚拟机最早是由一家名不见经传的小公司“ Longview Technologies”研发设计出来的,后来这家公司被 Sun 公司收购后, HotSpot 虚拟机也同样被纳入麾下。
HotSpot VM 是目前市面上高性能虚拟机的代表作之一。它具备热点探测功能,可以通过此功能将一个被频繁调用的方法或者方法体中有效循环次数较多的代码块标记为“热点代码”,然后通过内嵌的双重 JIT( Just In Time Compiler)编译器将字节码直接编译为本地机器指令。在 HotSpot VM 内部,即时编译器与解释器是并存的,通过编译器与解释器的协同工作,既可以保证程序的响应时间,同时还能够提高程序的执行性能,并且对编译器的工作压力也降低了一定程度的负载。换句话说 HotSpot 是一款解释器与编译器并存的虚拟机,缺省情况下一个程序中到底有多少字节码指令是通过解释运行的,还是通过编译运行的,这就需要依赖热点探测功能。
虽然 Java 虚拟机规范并没有强制要求虚拟机内部实现一定要采用解释器和编译器并存的架构方案,但目前市面上大多数主流虚拟机都采用此架构。这是因为当虚拟机启动的时候,解释器可以首先发挥作用,而不必等待编译器全部编译完成再执行,这样可以省去许多不必要的编译时间。并且随着程序运行时间的推移,编译器逐渐发挥作用,根据热点探测功能,将有价值的字节码编译为本地机器指令,以换取更高的程序执行效率。 HotSpot VM 中内嵌有两个 JIT 编译器,分别为 Client Compiler 和 Server Compiler,但大多数情况下我们简称为C1 编译器和 C2 编译器。开发人员可以通过命令显式指定到底使用哪一种编译器策略,缺省情况下 HotSpot 会根据操作系统版本与物理机器的硬件性能进行自动选择。 当然开发人员还可以通过命令显式指定 HotSpot VM 到底是使用完全编译策略,还是完全解释策略,如果我们将虚拟机选定为完全解释策略,那么编译器将停止所有的工作,字节码将完全依靠解释器逐行解释执行。反之也可以选用完全编译策略,但解释器仍然会在编译器无法进行的特殊情况下介入执行,这主要是确保程序能够最终顺利执行,