首先,我们先对java编程语言的编译和执行进行一个整体的了解。我们可以用两个阶段来概括:
一是java代码的编译阶段,二是java程序的运行阶段。
在java代码的编译阶段,主要的任务是将编写好的xxx.java的源代码文件在dos命令窗口中使用java的编译器工具javac将.java后缀的java源文件编译为一个或者多个.class后缀的字节码文件(这里的字节码文件并非是二进制文件)。
当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体平台,只面向JVM。
不同平台,上的JVM都是不同的,但它们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。
显然,相同的字节码程序需要在不同的平台上运行,这几乎是“不可能的”,只有通过中间的转换器才可以实现,JVM就是这个转换器。
JVM的作用很容易理解,就像有两支不同的笔,但需要把同一个笔帽套在两支不同的笔上,只有为这两支笔分别提供一个转换器,这个转换器向上的接口相同,用于适应同一个笔帽;向下的接口不同,用于适应两支不同的笔。在这个类比中,可以近似地理解两支不同的笔就是不同的操作系统,而同一个笔帽就是Java字节码程序,转换器角色则对应JVM。类似地,也可以认为JVM分为向上和向下两个部分,所有平台上的JVM向上提供给Java字节码程序的接口完全相同,但向下适应不同平台的接口则互不相同。
紧接着就是java程序的运行阶段,在java运行阶段,需要使java.exe的运行工具将编译后的.class后缀的字节码文件加载到java虚拟机JVM中,此时java虚拟机JVM会启动加载器classloader,classloader会在硬盘中搜索.class 的字节码文件,并能够将该字节码文件装载到JAVA虚拟机JVM中并解释为二进制文件,然后JAVA虚拟机JVM会执行该二进制文件和底层硬件平台进行交互。这就是整个java编程的编译和执行过程。
这样我们了解了java编程的编译和执行过程后,我们再来看JDK、JRE、JVM的作用和关系。
JDK :英文名称(Java Development Kit),JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品Java 开发工具包,是整个 Java 开发的核心,集成了JRE 和一些其它的工具。例如:javac.exe,java.exe,jar.exe 等。
JRE :英文名称(Java Runtime Environment),根据翻译,直接直接理解为Java 运行时环境,是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用,它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。
JVM :英文名称(Java Virtual Machine),也就是我们常说的 Java 虚拟机。它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给操作系统执行。
从概念上理解了JDK、JRE、JVM各自的作用后,我们不难看出之间的关系也就很清楚了,对于JVM是java程序与操作系统交换的必要环境,而JRE运行环境是java程序能够被java虚拟机JVM调用和执行的运行环境。对于JDK来说,更多的作用是编写java程序,是开发环境,只不过JDK包含了JER,它的范围更大。
简单的说,jre包含了JVM,一般而言,如果只是运行java程序,只需要安装jre,无需安装jdk,如果需要开发java程序,则需要安装jdk,当然,安装了jdk之后,也就包含了jre了
总结就是:JRE是运行环境,JDK是个开发环境。编写Java程序的时需要JDK,而运行Java程序的时候需要JRE;JDK里面已经包含JRE,若安装了JDK,就可以既编辑Java程序,又可以运行Java程序,无需单独的JRE。对于JDK而言,包含了许多与运行无关的内容,占用的空间较大,因此运行普通的Java程序无须安装JDK,而只需要安装JRE即可。