java语言平台架构
java语言的平台架构由下面四部分组成:
- java编程语言
- java的class文件格式
- java应用程序接口(API)
- java虚拟机
这四部分的关系如下图所示:
可以看到,java编程环境分为两个时期,编译时和运行时,程序中的java源文件(A.java, B.java)在编译期通过java提供的编译器编译成class文件(A.class, B.class)。class文件的内容就是大家常说的字节码,java虚拟机在运行时期加载并执行相应的class文件,如果java源程序中调用了java api的方法,则在程序执行期间会加载该方法的Java API class文件。
Java虚拟机和Java API一起为编译过的Java程序提供了一个平台,这个平台被称为Java运行时系统,也叫Java平台。因为Java平台可以用软件实现,所以java程序可以在很多不同种类的计算机上运行,也就是我们常说的Java平台无关性,如下图所示:
Java虚拟机
执行引擎是Java虚拟机的一部分,他可以有不同的实现方式。在以软件实现的Java虚拟机中,最简单的执行引擎只是每次解释字节码。另一种比较快速但是需要更多内存消耗的执行引擎是即时编译器(just-in-time complier)。在这种方案中,方法在第一次被调用时,该方法的字节码被编译成本地机器码。方法的本地机器码会被缓存起来,这样下次同样的方法被调用时,这些机器码就可以被重用。第三种类型的执行引擎具有自适应优化的功能。用这种方法,虚拟机开始解释字节码,但会监听运行程序的活动并识别出被大量使用的代码区域。当程序运行时,虚拟机只会编译并优化这些被大量用到的代码。其他的没有被大量使用的代码依然以字节码的形式被虚拟机解释执行。这种自适应优化的方法使Java虚拟机能够使用80%~90%的时间来执行被高度优化过的本地代码,并且只需要通过编译10%~20%的对性能影响较大的代码。
以软件的形式实现的Java虚拟机是在操作系统之上的,Java程序通过调用native方法与系统进行交互。在Java中有两种类型的方法:Java和native。java方法是以java语言编写,编译成字节码,并存储在class文件中。native方法是用其他语言编写的,如C,C++,并且被编译成特定处理器的本地机器码。native方法被存储在动态链接库中,动态链接库的形式由特定的平台指定。Java方法是平台独立的,而native方法则依赖与具体平台。如下图所示,native方法是java程序与操作系统沟通的桥梁。
使用native方法可以让应用程序直接访问操作系统下的资源,但这样,你的程序会依赖于指定平台,因为包含native方法的动态链接库是平台指定的。另外,native方法的使用也使你的程序依赖于具体java平台的特定实现。Java Native Interface(JNI)使得native方法可以在特定的系统中与任意的java平台实现工作。