另外,JIT(Just In Time,及时编译)技术也是一个比较好的思想。它的基本原理是,首先,通过Java编译器把Java源代码编译成与平台无关的二进制字节码。然后,在Java程序真正执行之前,系统通过JIT编译器把Java的字节码编译为本地化机器码。最后,系统执行本地化机器码,不用对字节码进行解释。这样做的优点是,大大提高了Java程序的性能,缩短了加载程序的时间;同时,由于编译的结果并不在程序运行期间保存,因此也节约了存储空间。缺点是,由于JIT编译器对所有的代码都想优化,因此同样也占用了很多时间。
动态优化技术即提前编译为机器码的技术(dynamicopttmization,ahead of time technology)是提高Java性能的另一个尝试。动态优化技术充分利用了Java源码编译、字节码编译、动态编译和静态编译的技术。其输入是Java的源码或字节码。而输出是经过高度优化的可执行代码和动态库(WindoW中是.dil文件,UNIX中是共享库.a.so文件)。其优点是能大大提高程序的性能,缺点是破坏了Java的可移植性,也对Java的安全带来了一定的隐患。
2 JNI技术
实际上,有一种通常被忽视的技术可以在很大程度上解决这个难题,那就是JNI(Java Native Interface,Java本地化方法)。图1是JNI技术实现的一般步骤。
(1)编写Java类代码
其中,需要JNI实现的方法应当用native关键字声明。在该类中,用System.1oadLibrary()方法加载需要的动态链接库。关键代码如下:
//Compute.java
public class Compute{
public native double comp (double params);
static{
//调用动态链接库
System.loadLibrary(“mathlib”);
}
(2)编译成字节代码
在这个过程中,由于采用了native关键字声明,Java编译器会忽视没有代码体的JNI方法部分。
(3)生成相关JNI方法的头文件
这个过程的实现一般是通过利用jlavah-jni * class生成的,也可以手工生成该文件;但是由于Java虚拟机是根据一定的命名规范完成对JNI方法的调用,所以手工编写头文件需要特别小心。
上述文件产生的头文件部分代码如下:
//Compute.h
;
extern“C”{
JNIEXPORT jdoubleJNICALL Java_Compute_comp(JNI-Env *, jobject, jdoubleArray);
;
JNI函数名称分为三部分:首先是Java关键字,供Java虚拟机识别;然后是调用者类名称(全限定的类名,其中用下划线代替名称分隔符);最后是对应的方法名称,各段名称之间用下划线分割。