【Java基础】JRE、JDK、JVM之间的联系

1.什么是Java体系

  1. SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。

  2. EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。

  3. ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,改名为Java ME。

2.编译器,调试器

JAVA编译器(javac.exe)

  1. javac.exe的作用是将(.java文件)编译成字节码文件(.class),是最基本的开发工具。编译时首先读入java源程序(即在DOS命令行下键输入javac HelloWorld.java等文件名参数和其他选项参数),然后进行语法检查,如果出现问题就终止编译。语法检查通过后,生字节码,字节码文件名和源文件名相同,扩展名为.class

编译器工作原理

  1. 字节码文件是一种和任何具体机器环境及操作系统环境无关的中间代码,它是一种二进制文件,是Java源文件由Java编译器编译后生成的目标代码文件。编程人员和计算机都无法直接读懂字节码文件,它必须由专用的Java解释器来解释执行,因此Java是一种在编译基础上进行解释运行的语言。

  2. Java解释器负责将字节码文件翻译成具体硬件环境和操作系统平台下的机器代码,以便执行。因此Java程序不能直接运行在现有的操作系统平台上,它必须运行在被成为Java虚拟机的软件平台之上。

  3. Java语言这种“一次编写,到处运行”的方式,有效地解决了目前大多数高级程序设计语言需要针对不同系统来编译产生不同机器代码的问题,即硬件环境和操作平台的异构问题,大大降低了程序开发、维护和管理的开销。

JAVA调试器

  1. java.exe是java虚拟机
  2. javadoc.exe用来制作java文档
  3. jdb.exe是java的调试器
  4. javaprof.exe是剖析工具
  5. javac.exe编译java成二进制class文件

java 线上问题定位工具
https://blog.csdn.net/weixin_30716725/article/details/95002051
jdk常用调试工具
https://blog.csdn.net/denganming1214/article/details/82692635
JVM常用调试参数和工具
https://blog.csdn.net/opensure/article/details/46715769
jvm调试工具说明
https://blog.csdn.net/yongche_shi/article/details/38270793

3. JVM,JRE,JDK区别

JVM
Java Virtual Machine(Java虚拟机)java虚拟机是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
但是!!!只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。

JRE
Java Runtime Environment(Java运行环境)包含JVM标准实现及Java核心类库。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)

  • JRE中包含虚拟机Jvm,运行类库(runtime class libraries)和启动器(Javaapplication launcher)。这些是运行Java程序的必要组件。

JDK
Java Development Kit(Java开发工具包)是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvmlib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre

在这里插入图片描述
由上图一目了然:

  1. JDK是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。
  2. JRE是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
  3. JVM是整个java实现跨平台的最核心的部分,能够运行以Java语言写的程序。

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

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

jdk 安装成功后,在安装目录目录会是这样的(我装的 jdk1.8 的版本,装在E盘)
在这里插入图片描述
安装目录下的JRE
在这里插入图片描述
而 jdk 的子目录下也存在一个 jre
在这里插入图片描述

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

  1. 答案是:没有联系 , 准确的来说,它俩是一样的,无论是用哪一个都是可以的。只是很多人习惯将会单独安装另一个 jre,虽然单独安装的 jre 也并没有被使用,原因可能就是刚开始大家都不清楚 jdk 和 jre 之间的关系,所以就默认的都安装上了。

  2. 最开始使用JAVA时除了设置环境变量JAVA_HOME(JDK安装路径)外,还会设置环境变量ClassPath%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;dt.jar和tools.jar是两个java最基本的包,里面包含了从java最重要的lang包到各种高级功能如可视化的swing包,是java必不可少的。而环境变量path下面的bin里面都是java的可执行的编译器及其工具,如java,javadoc等,你在任意的文件夹下面运行cmd键入javac,系统就能自动召见java的编译器就是归功于这个环境变量的(path)设置 ;如果修改其中tools.jar的名字,cmd运行的时候会报错:
    2.
    报错的原因:就是输入的javac的命令不是去JDK中bin目录去找的javac.exe,而是去JDK中lib目录中的tools.jar中com.sun.tools.javac.Main中执行,因此javac.exe只是一个包装器(Wrapper),存在的目的是为了让开发者免于输入过长的指命。这个时候发现JDK里的工具几乎是用Java所编写,同属于Java应用程序,因此要使用JDK所附的工具来开发Java程序,所以自身需要附一套JRE才能运行。上图中与jdk同级目录下的JRE就是用来运行一般Java程序用的。
    在这里插入图片描述
    两套JRE运行的时候究竟运行哪一个呢,这个时候JDK中java.exe先从自身目录中找,然后父级目录中找,如果都没有就去注册表中找:
    在这里插入图片描述

  3. jdk 是的开发工具包,它集成了 jre ,因此在安装 jdk 的时候可以选择不安装 jre 而直接使用 jdk 下的 jre 运行我们的 Java 程序。(但是大部分人都默认将两个都装上了)。但是如果你的电脑不是用来开发 Java 程序的,而仅仅是用来部署和运行 Java 程序的,那么完全可以不用安装 jdk,只需要安装 jre 即可。

2.2 Java 为什么能跨平台,实现一次编写,多处运行?

  1. Java 能够跨平台运行的核心在于 JVM。不是 Java 能够跨平台,而是它的 jvm 能够跨平台。我们知道,不同的操作系统向上的 API 肯定是不同的,那么如果我们想要写一段代码调用系统的声音设备,就需要针对不同系统的 API 写出不同的代码来完成动作。

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

JDK1.8安装目录

在这里插入图片描述

  • bin:最主要的是编译器(javac.exe);

-include:java和JVM交互用的头文件;

  • lib:常用类库

  • jre:java运行环境

JDK包含JRE,而JRE包含JVM,总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能,Eclipse、IntelliJ IDEA等其他IDE有自己的编译器而不是用JDK bin目录中自带的,所以在安装时只需选中jre路径就ok了

发布了62 篇原创文章 · 获赞 109 · 访问量 5316

猜你喜欢

转载自blog.csdn.net/qq877728715/article/details/102650537