弄懂 JRE、JDK、JVM 之间的区别与联系

其实不少 Java 程序员在写了不少代码后,你问他 jre 和 jdk 之间有什么关系,jvm 又是什么东西,不少人不知所云。本篇不会讲述 jvm 底层是如何与不一样的系统进行交互的,而主要理清楚三者之间的区别,搞清楚咱们写的 xxx.java 文件是被谁编译,又被谁执行,为何可以跨平台运行。java

首先,咱们分别对这三者进行阐述。git

JVM :英文名称(Java Virtual Machine),就是咱们耳熟能详的 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它可以将 class 文件中的字节码指令进行识别并调用操做系统向上的 API 完成动做。因此说,jvm 是 Java 可以跨平台的核心,具体的下文会详细说明。程序员

JRE :英文名称(Java Runtime Environment),咱们叫它:Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来讲,多出来的是一部分的 Java 类库。github

JDK :英文名称(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。微信

显然,这三者的关系是:一层层的嵌套关系。JDK>JRE>JVMjvm

接着,提出一个问题:为何咱们的电脑在装完 jdk 后会有两个版本的 jre工具

留心的同窗可能会发现,咱们的 jdk 安装成功后,在 C:\Program Files\Java 目录会是这样的(这里,我是装的 jdk1.8 的版本)学习

image

而 jdk 的子目录下也存在一个 jre。开发工具

image

这两个不一样版本的 jre 相互之间有什么联系吗?操作系统

答案是:没有联系。甚至准确的来讲,它俩是同样的,不管是用哪个都是能够的。只是不少人习惯将会单独安装另外一个 jre,虽然单独安装的 jre 也并无被使用,缘由可能就是刚开始你们都不清楚 jdk 和 jre 之间的关系,因此就默认的都安装上了。

在 jdk 的 bin 目录下,基本上都是一些可执行文件,而且它们还不大。其实这些可执行文件只是外层的一层封装而已,这样的目的是避免输入的命令过长。例如 javac.exe 内部调用的实际上是 JDK 中 lib 目录中的 tools.jar 中 com.sun.tools.javac.Main 类,也就是说这些工具只是入口而已。而实际上它们自己又都是由 Java 编写的,因此在 jdk 目录下的 jre 既提供了这些工具的运行时环境,也提供了咱们编写完成的 Java 程序的运行时环境。

因此,很明显,jdk 是咱们的开发工具包,它集成了 jre ,所以咱们在安装 jdk 的时候能够选择再也不安装 jre 而直接使用 jdk 中的 jre 运行咱们的 Java 程序。(可是大部分人都默认将两个都装上了)。可是若是你的电脑不是用来开发 Java 程序的,而仅仅是用来部署和运行 Java 程序的,那么彻底能够不用安装 jdk,只须要安装 jre 便可。

下一个问题,Java 为何能跨平台,实现一次编写,多处运行?

Java 可以跨平台运行的核心在于 JVM 。不是 Java 可以跨平台,而是它的 jvm 可以跨平台。咱们知道,不一样的操做系统向上的 API 确定是不一样的,那么若是咱们想要写一段代码调用系统的声音设备,就须要针对不一样系统的 API 写出不一样的代码来完成动做。

而 Java 引入了字节码的概念,jvm 只能认识字节码,并将它们解释到系统的 API 调用。针对不一样的系统有不一样的 jvm 实现,有 Linux 版本的 jvm 实现,也有 Windows 版本的 jvm 实现,可是同一段代码在编译后的字节码是同样的。引用上面的例子,在 Java API 层面,咱们调用系统声音设备的代码是惟一的,和系统无关,编译生成的字节码也是惟一的。可是同一段字节码,在不一样的 jvm 实现上会映射到不一样系统的 API 调用,从而实现代码的不加修改便可跨平台运行。

本篇文章主要描述了 Java 相关的最基本的概念,理解了这几个基本的概念后,后续的学习才会有根有据,不会稀里糊涂的。

文章中的全部代码、图片、文件都云存储在个人 GitHub 上:

(https://github.com/SingleYam/overview_java)

欢迎关注微信公众号:扑在代码上的高尔基,全部文章都将同步在公众号上。

image

相关文章
相关标签/搜索