详解JDK,JRE,JVM之间的区别与联系

详解JDK,JRE,JVM之间的区别与联系

已经用了一段时间的Java了,忽然想到这个问题还真的一下子说不明白。相信这个问题也是我们众多小白所关心的问题,于是乎胖胖的飞象通过广泛的查阅资料,今天来为大家简单总结一下这三者的区别与联系。

首先以一幅简单的图片描述三者的关系:

详解JDK,JRE,JVM之间的区别与联系_第1张图片

JVM(Java Virtual Machine,Java虚拟机)

JVM是JRE的一部分,它是一个虚构出来的计算机,能够运行以Java语言编写的软件程序,是通过在实际的计算机上仿真模拟各种计算机功能来实现的(Jvm 是 Java 能够跨平台的核心,具体的下文会详细说明)。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用。

Java语言是跨平台运行的,其实就是不同的操作系统,使用不同的JVM映射规则,让其与操作系统无关,完成了跨平台性。JVM 对上层的 Java 源文件是不关心的,它关注的只是由源文件生成的类文件( class file)。类文件的组成包括 JVM 指令集,符号表以及一些补助信息。它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作(JRE中的lib)。

JRE(Java Runtime Environment,Java运行环境)

也就是我们说的JAVA平台,所有的Java程序都要在JRE下才能运行。JRE包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具——编译器、调试器和其它工具。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)。光有JVM是不能成class的执行的,因为在解释class的时候JVM需要调用解释所需要的类库lib。(JRE里有运行.class的java.exe)。

在JDK的安装目录里你可以找到jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。所以,在你写完java程序编译成.class之后,你可以把这个.class文件和jre一起打包发给朋友,这样你的朋友就可以运行你写程序了。

综上如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可,并不需要安装JDK,只安装JVM是不行滴。

JDK(Java Development Kit,Java开发工具)

JDK包括了JRE,JRE包括了JVM。JDK包括一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。JDK是java开发工具包,基本上每个学java的人都会先在机器上装一个JDK,那他都包含哪几部分呢?在目录下面有 六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的 是以下四个文件夹:bin、include、lib、 jre。

最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了属于自己的JDK,例如国外IBM公司开发了属于自己的JDK,国内淘宝也开发了属于自己的JDK,各个组织开发自己的JDK都是为了在某些方面得到一些提高,以适应自己的需求,比如IBM的JDK据说运行效率就比SUN的JDK高的多。但不管怎么说,我们还是需要先把基础的Sun JDK掌握好。

JDK有以下三种版本:

J2SE,standard edition,标准版,是我们通常用的一个版本;J2EE,enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序(不过这个版本的功能更丰富,也是我们更常用的版本);J2ME,micro edtion,主要用于移动设备、嵌入式设备上的java应用程序。

作为JDK工具库中有七种主要程序:

Javac:Java编译器,将Java源代码转换成字节码。

Java:Java解释器,直接从类文件执行Java应用程序字节代码。

appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。

Javadoc:根据Java源码及说明语句生成HTML文档。

Jdb:Java调试器,可以逐行执行程序,设置断点和检查变量。

Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。

Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。

总结

1. 三者区别

a.JDK和JRE区别:在bin文件夹下会发现,JDK有javac.exe而JRE里面没有,javac指令是用来将java文件编译成class文件的,这是开发者需要的,而用户(只需要运行的人)是不需要的。JDK还有jar.exe, javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。

b.JRE和JVM区别:JVM并不代表就可以执行class了,JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。

2. 三者联系

JVM不能单独搞定class的执行,解释class的时候JVM需要调用解释所需要的类库lib。在JDK下面的的jre目录里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。JVM+Lib=JRE。

最后:

我们开发的实际情况是:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。

你可能感兴趣的:(java)