从1.3节的例子可知,Java源程序编写好之后需要经过编译步骤,但这个编译步骤不会产生特定平台的机器码,而是生成一种与平台无关的字节码(也就是.class文件)。这种字节码不可直接执行,必须使用Java解释器解释执行。负责解释执行字节码的是Java虚拟机,Java为不同的操作系统提供不同版本的Java虚拟机,因此可以实现跨平台。本节重点讲解Java程序的运行机制以及跨平台的原理。
JDK、JRE和JVM是令Java初学者最容易迷惑的几个概念。本节重点解释这几个概念之间的区别和联系。
JDK全称为Java Development Kit,即Java开发工具包。它为开发人员提供开发项目时需要的工具以及运行时所需要的环境。JDK是整个Java开发的核心,包含Java的运行环境(JRE)和Java工具(例如javac和java等)。如果要开发Java程序,必须安装JDK。
JRE全称为Java Runtime Environment,即Java程序的运行时环境,包含JVM和运行时所需要的核心类库。如果只是运行Java程序,那么只需安装JRE即可。
JVM全称为Java Virtual Machine,即Java虚拟机,负责解释执行字节码。
这三者之间的关系可以用图1-14说明。
图1-14 JDK、JRE和JVM的关系图
通过1.3节的例子可以看到,一个Java程序从编写到运行需要经过三个步骤,即编写、编译和运行,如图1-15所示。Java源程序经过javac工具编译后生成字节码文件,接着Java虚拟机从后缀为“.class”文件中加载字节码到内存中,然后检测代码的合法性和安全性,例如检测Java程序用到的数组是否越界、所要访问的内存地址是否合法等,最后解释执行通过检测的代码,并根据不同的计算机平台将字节码转化成为相应的计算机平台的机器代码,交给相应的计算机执行。如果加载的代码不能通过合法性和安全性检测,则Java虚拟机执行相应的异常处理程序。Java虚拟机不停地执行这个过程,直到程序结束。
图1-15 Java程序的运行过程
不同平台上的JVM都是不同的,但向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。JVM是Java程序跨平台的关键部分,只要为不同的平台实现相应的虚拟机,编译后的Java字节码就可以在该平台上运行。所以可以实现一次编译,处处运行。Java跨平台原理如图1-16所示。
图1-16 Java跨平台机制