家园论坛
楼主 封过留痕 说:

    

新的一天开始,我们开始踏上新的征程,,新的文章送上!祝福大家每天收获一点点,每天进步一点点!
懂与不懂都是收获!

盲人学JAVA之基础篇 一 JDK、JVM、JRE之间的区别与联系

一 基本概念

JDK: Java Development Kit JAVA开发工具包
是针对Java开发人员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。

JRE: Java Runtime Environment JAVA运行时环境
 是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
JVM: Java Virtual Machine Java虚拟机
是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。


二 三者之间的区别与联系
JVM(java virtual machine)
java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。
也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
只有JVM还不能完成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而JRE包含lib类库。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

JRE Java RunTime Environment Java运行时环境
是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到服务器上,供用户使用。
JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。
与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。
JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。

显然,这三者的关系是:一层层的嵌套关系。
JDK包含JRE,JRE包含JVM

三 为什么我们的电脑在装完JDK8即以前的版本  后会有两个的 JRE目录
 jdk 安装成功后, 默认安装路径
C:\Program Files\Java
在这个目录下 有一个JRE
而 jdk 的子目录下也存在一个 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 程序。(但是大部分人都默认将两个都安装了。
PS:JDK9和10我没有安装过,这里就不讨论了,在JDK11以后,就没有JRE目录了。

四Java 为什么能跨平台,实现一次编写,多处运行?
Java 能够跨平台运行的核心在于 JVM。
不是 Java 能够跨平台,而是它的 jvm 能够跨平台。
我们知道,不同的操作系统上的 API 肯定是不同的,那么如果我们想要写一段代码调用系统的声音设备,就需要针对不同系统的 API 写出不同的代码来完成动作。
而 Java 引入了字节码的概念,jvm 只能认识字节码,并将它们解释到系统的 API 调用
。针对不同的系统有不同的 jvm 实现,
如有 Linux 版本的 jvm 实现,也有 Windows 版本的 jvm 实现,但是同一段代码在编译后的字节码是一样的
。引用上面的例子,在 Java API 层面,我们调用系统声音设备的代码是唯一的,和系统无关,编译生成的字节码也是唯一的。
但是同一段字节码,在不同的 jvm 实现上会映射到不同系统的 API 调用,从而实现代码的不加修改即可跨平台运行。
PS:文章部分内容参考了网上一些大神的文章,如有看过的请一笑而过!


欢迎喜欢编程的朋友回帖讨论,您的回帖是对我的最大支持!您的支持是我创作的源泉!

喜欢编程的朋友,可以加下面我建的群,里面有开发相关的JDK和开发工具eclipse的下载,    里面大神多多,欢迎来交流学习:
点击链接加入群聊【盲人学JAVA集中营】:
https://jq.qq.com/?_wv=1027&k=5L7gk3B

2019-06-02 15:18:11
如发帖或回帖,请先点击登录
上一篇 盲人学编程之基础篇:二 JDK11的下载、安装及环境变量设置 下一篇 12名视障学生的“城市行走”
copy@2007-2019 ymax.cn Inc.All Rights Reserved
沂蒙爱心家园 版权所有 鲁ICP备 07012196 号
鲁公网安备37132302000324号
总访问量:12808420     当前在线人数:143