HotSpot

HotSpot

SUN 的 JDK 版本从 1.3.1 开始运用 HotSpot 虚拟机,2006 年底开源,主要使用 C++实现,JNI 接口部分用 C 实现。HotSpot 是较新的 Java 虚拟机,用来代替 JIT(Just in Time),可以大大提高 Java 运行的性能。Java 原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢。而 HotSpot 将常用的部分代码编译为本地(原生,native)代码,这样显着提高了性能。HotSpot JVM 参数可以分为规则参数(standard options)和非规则参数(non-standard options)。规则参数相对稳定,在 JDK 未来的版本里不会有太大的改动,非规则参数则有因升级 JDK 而改动的可能。

HotSpot 包括一个解释器和两个编译器(client 和 server,二选一的),解释与编译混合执行模式,默认启动解释执行。HotSpot 采取的是动态编译(Compile During Runtime/Dynamic Compilation)机制,即对 bytecode 的编译不是在程序运行前编译的,而是在程序运行过程中编译的。HotSpot 里运行着一个监视器(Profile Monitor),用来监视程序的运行状况。Java 字节码(class 文件)是以解释的方式被加载到虚拟机中(默认启动时解释执行)。程序运行过程中,那一部分运用频率大,那些对程序的性 能影响重要。对程序运行效率影响大的代码,称为热点(hotspot),HotSpot 会把这些热点动态地编译成机器码(native code),同时对机器码进行优化,从而提高运行效率。对那些较少运行的代码,HotSpot 就不会把他们编译。HotSpot 对字节码有三层处理:不编译(字节码加载到虚拟机中时的状态。也就是当虚拟机执行的时候再编译),编译(把字节码编译成本地代码。虚拟机执行的时候已经编译好了,不要再编译了),编译并优化(不但把字节码编译成本地代码,而且还进行了优化)。

动态编译器也在许多方面比静态编译器优越。静态编译器通常很难准确预知程序运行过程中究竟什么部分最需要优化。函数调用都是很浪费系统时间的,因为有许多进栈出栈操作。因此有一种优化办法,就是把原来的函数调用,通过编译器的编译,改成非函数调用,把函数代码直接嵌到调用出,变成顺序执行。面向对象的语言支持多态,静态编译无效确定程序调用哪个方法,因为多态是在程序运行中确定调用哪个方法。

下一页