7.5 HotSpot虚拟机

目前有不同厂商或机构开发的Java虚拟机实现。所有这些虚拟机实现都遵守Java虚拟机规范,但是所适用的情况有所不同。Java SE 7的OpenJDK实现使用的是Oracle的HotSpot虚拟机。HotSpot虚拟机从JDK 1.3开始是Sun提供的默认虚拟机实现。大部分开发人员在使用Java SE 7时都使用默认虚拟机。本节会介绍HotSpot虚拟机的相关细节,主要目的是帮助开发人员更好地了解和使用HotSpot虚拟机。

7.5.1 字节代码执行

Java语言的源代码在经过Java编译器的编译之后,被转换成Java字节代码。虚拟机在执行字节代码时一般采用的是即时编译的方式,即所谓的Just-in-time(JIT)编译方式。虚拟机会在运行过程中把字节代码中的指令直接转换成底层操作系统平台上的原生指令。由于虚拟机所理解的只是Java的字节代码格式,因此这样的转换是必需的。不过JIT编译方式有一些性能方面的问题,会降低程序的执行效率。HotSpot虚拟机采用了自适应的优化技术来解决JIT编译方式的性能问题。这项优化技术的关键是利用程序运行中的热点(hot spot),这也是HotSpot虚拟机名称的由来。

程序运行过程中的一个重要特征是程序局部性,即在程序的运行过程中,小部分代码会占据比较多的运行时间。这小部分的代码被称为程序运行中的热点。这也是“80-20原则”的体现,程序中20%的代码会占据80%的运行时间。如果把这重要的20%的代码的优化工作做好,就可以节省大量的时间。在程序刚开始运行的时候,HotSpot虚拟机会分析程序的字节代码,以找出其中的热点,并对这些热点进行复杂的优化工作。随着程序的运行,其中的热点可能会发生变化。虚拟机会随时监控程序的运行状态,以追踪其中的热点。利用热点的好处在于不需要对程序中的所有代码都进行复杂的优化,这样可以把时间用在对重要代码的优化上,减少代码优化的时间开销。

HotSpot虚拟机的另外一个优化措施是方法内联。虚拟机在运行过程中的大部分时间都花费在方法调用上。方法内联的作用是把被调用的方法中的代码直接内联到调用的地方。通过这种方式可以减少方法调用,同时为虚拟机提供更多可以优化的代码。