java的编译器首先把java源文件编译为字节码。这些字节码对于java虚拟机(jvm)来讲就是机器的指令码。然后,java的解释器不断的循环取出字节码进行解释并执行。 这样做的优点是可以实现java语言的跨平台,同时生成的字节码也比较紧凑。java的一些优点,如安全性,动态性都得保持;但缺点是省生成的字节码没有经过什么优化,同全部编译好的本地码相比,速度比较慢。 b) 及时编译技术(just in time) 及时编译技术是为了解决指令解释技术效率比较低,速度比较慢的情况下提出的,其结构图如下所示。
其主要变化是在java程序执行之前,又jit编译器把java的字节码编译为机器码。从而在程序运行时直接执行机器码,而不用对字节码进行解释。同时对代码也进行了部分的优化。 这样做的优点是大大提高了java程序的性能。同时,由于编译的结果并不在程序运行间保存,因此也节约了存储空间了加载程序的时间;缺点是由于jit编译器对所有的代码都想优化,因此也浪费了很多的时间。 ibm和sun公司都提供了相关的jit产品。 c) 适应性优化技术(adaptive optimization technology) 同jit技术相比,适应性优化技术并不对所有的字节码进行优化。它会跟踪程序运行的成个过程,从而发现需要优化的代码,对代码进行动态的优化。对优化的代码,采取80/20的策略。从理论上讲,程序运行的时间越长,代码就越优化。其结构图如下:
其优点是适应性优化技术充分利用了程序执行时的信息,发行程序的性能瓶颈,从而提高程序的性能;其缺点是在进行优化时可能会选择不当,发而降低了程序的性能。 其主要产品又ibm,sun的hotspot. d) 动态优化,提前编译为机器码的技术(dynamic optimization,ahead of time) 动态优化技术充分利用了java源码编译,字节码编译,动态编译和静态编译的技术。其输入时java的原码或字节码,而输出是经过高度优化的可执行代码和个来动态库的混合(window中是dll文件,unix中是共享库.a .so文件)。其结构如下: