这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战
Hot Spot的前世今生
当我们看一些关于JVM的英文文章,经常会看到HotSpot这个词。
实际上,HotSpot就是我们正在用的JVM, 虚拟机在最初并非由Sun公司开发,而是由一家名为“Longview Technologies”的小公司设计的;甚至这个虚拟机最初并非是为Java语言而开发的,它来源于Strongtalk VM, 而这款虚拟机中相当多的技术又是来源于一款支持Self语言实现“达到C语言50%以上的执行效率”的目标而设计的虚拟机。
Sun 公司在1997年收购了Longview Technologies公司,从而获得了HotSpot VM。自从SUN买下后,已经把它放入JRE 1.3以及后续版本中。HotSpot VM既继承了Sun之前两款商用虚拟机的优点,也有许多自己新的技术优势,如它名称中的HotSpot指的就是它的热点代码探测技术。
在2006年的JavaOne大会上,Sun公司宣布最终会把Java开源,并在随后的一年,陆续将JDK的各个部分(其中当然也包括了HotSpot VM)在GPL协议下公开了源码,并在此基础上建立了OpenJDK。这样,HotSpot VM便成为了Sun JDK和OpenJDK两个实现极度接近的JDK项目的共同虚拟机。
现在它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。
Hot Spot实现的功能及原理
HotSpot VM的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知JIT编译器以方法为单位进行编译。如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作。HotSpot实际上是把Java的bytecode编译成Native code,然后运行,这样大大提高了Java程序的执行效率。
HotSpot里有一个运行监视器,即Profile Monitor,专门监视程序运行中,哪一部分运用频度大, 哪些对性能影响至关重要。当然Profile Monitor有一些算法,这些算法未必十全十美,但大体是能较好获得相关信息的。对于那些对程序运行效率影响交大的代码,称为热点,即hot spot,HotSpot会把这些部门动态地编译成机器码,Native code,同时也对机器码进行优化(类似C编译器的一些优化),从而而提高运行效率。而那些较少运行的Code,HotSpot虚拟机就不再浪费时间把它们编译。
通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减小,这样有助于引入更多的代码优化技术,输出质量更高的本地代码。