JVM、JRE、JDK之间的联系与区别
JVM (Java Virtual Machine)
? JVM(Java虚拟机)是一个可执行Java字节码的虚拟机进程,用于解析编译后的字节码文件。 JVM屏蔽了与操作系统平台相关的信息,可以把字节码解释成具体平台上的机器指令执行,这也是Java的能够 “一次编译,到处运行” 的原因。
? 既然JVM是“虚拟机”的意思,那么肯定要体现出来 : 可以把JVM类比为一台只针对Java程序的PC虚拟机,它通过实体计算机仿真各种计算功能来实现,JVM有自己完善的硬件架构,如处理器,堆栈,寄存器等,还有相应的指令集.
在Java的世界中,JVM的地位就像一台PC机器。JVM和PC物理机的宏观关系是这样的 :
JVM与物理PC的微观关系是这样的 :
Java世界中JVM与现实世界中的物理PC之间关系是这样的:
注意事项
? JVM的核心任务是解释字节码文件,它不能运行字节码文件。因为JVM执行class还需要JRE下的lib类库的支持,尤其是rt.jar,这一点非常重要.
JRE (Java Runtime Environment)
? 光有JVM还不能完成class的执行,需要搭配JRE才能正常运行程序员打好的jar包。因为在解释class的时候JVM需要调用解释所需要的类库lib,JRE里有运行.class 的java.exe .
? JRE是Java程序的运行环境,它包含JVM的标准实现及Java核心类库。需要注意的是 : JRE是Java的运行环境不是开发环境。JRE不包含任何开发工具,如:编译器、调试器等,因为JRE是面向Java程序(jar包)的,程序只需要运行不需要编译、调试等功能。如果只需要运行一些Java程序,只需要一个JRE就足够了,不需要安装JDK.
在Java的世界中,JRE的地位相当于是一台PC机器中的Windows操作系统. Windows操作系统可以运行.exe格式化的应用程序对应的JRE操作系统用于运行.jar格式的应用程序.
综上所述,Java世界中的JRE与现实世界中的PC操作系统之间关系是这样的 :
JDK (Java Development Kit)
JDK是java开发工具包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。JDK是面向程序员的。
基本上每个学java的人都会先在机器 上装一个JDK,那它都包含哪几部分呢?
安装完jdk之后,切换至jdk的安装根目录,可以看到几个目录:bin、jre、src.zip、db、lib、include。
bin :开发工具。里面可以看到一些我们很熟悉的工具,jar、java、javac、javadoc、javap、jconsole、jhat、jmap、jstack、jstat。jre :Java运行时环境。JRE包括Java虚拟机(JVM),类库和其他支持执行用Java编程语言编写的程序的文件(我们开发过程中经常使用到的核心类库就是在/jre/lib 下)。src.zip :Java类库源代码。构成Java核心API的所有类的Java编程语言源文件,(注意不是JVM源码)主要是想帮助开发人员学习和使用Java编程语言。db :Oracle分发的Apache Derby关系数据库。lib :其他库,开发工具所需的其他类库和支持文件,其中就有我们比较熟悉的 dt.jar 和tools.jar 。include :支持使用Java Native Interface和Java Virtual Machine(JVM)调试器接口进行本机代码编程的C语言头文件。
既然JDK安装目录中是包含JRE的,而JRE中是包含JVM的,所以电脑安装完JDK后就具备了开发Java源文件、编译class字节码文件、运行jar程序的功能。JDK直接打通了程序员与Java世界的壁垒,这就导致笔者到现在才搞清楚它们三者之间的关系,。
JVM、JRE、JDK三者之间的联系
综上所述,三者关系可以用下面一个场景来总结:
? 程序员借助JDK可以写好.Java源代码,然后使用JDK自带的javac 命令将源代码编译为.class 字节码文件,最后使用JDK的jar -cvf 命令打包为jar包 ,到这一步JDK的使命就完成了。有了jar包之后,下一步就是让jar跑起来,这一步就该JVM、JRE出场了,使用java -jar 运行程序。首先是在JRE上运行这些字节码,具体到字节码执行时就需要JVM解析字节码文件,并承担将字节码命令映射到CPU指令集或OS的系统调用。
|