四、JDK/JVM/JRE关系

参考文章https://blog.****.net/ancientear/article/details/79483592

目录

一、介绍

(1)JVM

(2)JDK

(3)JRE

(4)图解

二、JDK、JRE、JVM三者的联系与区别

(1)联系

(2)区别

三、问题一

四、问题二


一、介绍

(1)JVM

JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指定,管理数据、内存、寄存器。

  • 对于不同的平台,有不同的虚拟机。
  • 只有某个平台提供了对应的java虚拟机,java程序才可以在此平台运行。
  •  java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”。
  • 四、JDK/JVM/JRE关系

(2)JDK

  • java development kit  Java开发工具包
  • JDK提供了给java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用单独安装JRE了。
  • 其中的开发工具:编译工具(javac.exe)打包工具(jar.exe)等。

(3)JRE

  • java runtime environment Java运行环境
  • 包括java虚拟机(JVM)和java程序所需的核心类库等。如果想要运行一个开发好的java程序,计算机中只需要安装JRE即可。
  • 简单而言,使用JDK的开发工具完成的java程序,交给JRE去运行。

(4)图解

四、JDK/JVM/JRE关系四、JDK/JVM/JRE关系

二、JDK、JRE、JVM三者的联系与区别

(1)联系

  • 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的系统调用。

(2)区别

  • 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。
  • 这三者的关系是:一层层的嵌套关系。JDK>JRE>JVM

三、问题一

为什么我们的电脑在装完 jdk 后会有两个版本的 jre

这两个不同版本的 jre 相互之间有什么联系吗?

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

四、JDK/JVM/JRE关系

  • 而 jdk 的子目录下也存在一个 jre。

四、JDK/JVM/JRE关系

这两个不同版本的 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复习阶段,每天更新。学习快乐,心想事成(Learning to be happy is the key to success)