jdk,jre 与 jvm 的联系与区别

对于刚接触java的小伙伴们,对jdk,jre 与 jvm 的联系与区别可能一头雾水,很多java程序员在写了很多代码后,对于此问题也不知所云。本文就做一个回顾总结,希望可以帮到小伙伴们。

简单来说就是:

    JDK包含jre,jre包含jvm。jre只是提供了java的运行环境,只能运行class而没有编译功能,而JDK是用于java程序的开发,它的功能比较多。

jdk安装成功后,打开jdk目录可以看到,jdk的子目录下也存在一个jre。

其实这里的jre与安装jdk时询问我们是否要安装公共的jre是一样的,只是很多人习惯单独安装另一个jre。虽然单独安装的jre也没有被使用。 

那什么是jdk ,jre ,jvm 呢?

JDK :英文名称(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。JDK包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。

JDK中的四个文件夹:

    bin:最主要的是编译器(javac.exe)
    include:java和JVM交互用的头文件
    lib:类库
    jre:java运行环境

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

JVM :英文名称(Java Virtual Machine),就是 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。jvm调用解释所需的类库lib,而jre包含lib类库。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行(跨平台性:不同的浏览器安装不同的java虚拟机,jvm将字节码与对应操作系统相映射,达到java程序的跨平台性)。

简单来说三者的关系是:JDK>JRE>JVM。

那如果一台电脑中存在多个JRE,那么该如何选择呢?查找的顺序是这样的:

 1. 能否在java.exe目录下寻找到java.dll文件

 2. 能否在java.exe的上级目录找到jre目录

 3. 能否在注册表HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\查看CurrentVersion的键指向哪个JRE.

比如安装了公共JRE那么他会在注册表中记录版本与路径信息并且将java.exe拷贝到Winsows/System32目录下。由于该目录已经添加到环境变量因此不需要额外添加环境变量就可以使用java命令。

那么这时执行java命令。

首先他会到Winsows/System32目录下查找是否有java.dll文件,没有找到继续到上级目录查找是否有jre目录,也没找到然后到注册表中查找。

如果配置了java_home,首先到java_home/bin目录下查找java.dll文件没有找到,然后到上级目录寻找jre目录找到后加载java.dll文件。

jre包含jvm,那它们具体又是什么怎么样的呢?

JVM它是整个java实现跨平台的最核心的部分主要用来执行class文件,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的系统调用。这便是它们之间的联系。

JDK,JRE,JVM三者的区别
  1>. JDK和JRE区别:在bin文件夹下会发现,JDK有javac.exe而JRE里面没有,javac指令是用来将java文件编译成class文件的,这是开发者需要的,而用户(只需要运行的人)是不需要的。JDK还有jar.exe, javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。jdk是给开发人员使用的,jre和jvm是给普通用户使用。
  2>. JRE和JVM区别:JVM并不代表就可以执行class了,JVM执行.class还需要JRE下的lib类库的支持(rt.jar)。

发布了91 篇原创文章 · 获赞 1 · 访问量 3201

猜你喜欢

转载自blog.csdn.net/duan196_118/article/details/104208833