深入理解JVM虚拟机:JDK、JRE、JVM的区别

《深入理解Java虚拟机》 专栏收录该内容
5 篇文章 1 订阅

在讲解 JVM 虚拟机知识之前,我们有必要先弄清它的概念。

很多程序员已经干了一段时间 Java 开发了依然不明白 JDK、JRE、JVM 的区别,现在我们就捋一捋:

概念:

JDK(Java Development Kit):Java 语言的软件开发工具包(SDK),是整个JAVA的核心,是面向 Java 程序的开发者,提供了 Java 的运行环境(Java Runtime Envirnment)和开发环境 -- 一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。

JDK在目录下面有 六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行 Java 时起作用的是以下四个文件夹:bin、include、lib、 jre。

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

JRE(Java Runtime Enviroment):是指Java的运行环境,是面向Java程序的使用者,而不是开发者(若果只想运行 Java 的.class文件,只需要安装JRE就可以了)。它包含 JVM 标准实现及 Java 核心类库,因为并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)。
JRE是指java运行环境。光有JVM还不能成class的 执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。 (jre里有运行.class的java.exe)
JRE 是运行 Java 程序必不可少的,它的地位就象一台PC机一样,我们写好的 Win64 应用程序需要操作系统帮们运行。同样的,我们编写的 Java 程序也必须要 JRE 才能运行,因为在解释 .class 文件的时候 JVM 需要调用解释所需要的类库lib(JRE 里有运行.class的java.exe)。

总的来说 JDK 是用于 Java 程序的开发,而 JRE 则是只能运行 class 而没有编译的功能。

JVM(Java Virtual Machine):Java虚拟机,它是整个 Java 实现跨平台的最核心的部分,所有的 Java 程序会首先被编译为 .class 的类文件,这种类文件可以在虚拟机上执行,也就是说 class 并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。针对 Java 用户,也就是拥有可运行的 .class 文件包(jar或者war)的用户。里面主要包含了 JVM 和 Java 运行时基本类库(rt.jar)。

rt.jar 可以简单粗暴地理解为:它就是 Java 源码编译成的 jar 包。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够 “一次编译,到处运行” 的原因。

通过上面这张图,会帮助我们理解的更加直观。

有这样一个关系,JDK 包含 JRE,而 JRE 包 含JVM,详细点就是 :

  • JDK 包括编译器(javac.exe)、开发工具(javadoc.exe、jar.exe、keytool.exe、jconsole.exe)和更多的类库(如tools.jar)等;
  • JRE 包括 JVM 虚拟机(java.exe等)和基本的类库(rt.jar等),用来支撑Java程序的运行;

区别和联系:

三者联系:

  1. JVM 不能单独搞定class的执行,解释 class 的时候 JVM 需要调用解释所需要的类库lib。
  2. 在JDK下面的的 jre 目录里面有两个文件夹 bin 和 lib,在这里可以认为 bin 里的就是 jvm,lib 中则是 jvm 工作所需要的类库,而 jvm 和 lib 和起来就称为 jre,即:JVM + Lib =J RE。
  3. 总体来说就是,我们利用 JDK(调用 JAVA API)开发了属于我们自己的 JAVA 程序后,通过 JDK 中的编译程序(javac)将我们的文本 java 文件编译成 JAVA 字节码,在 JRE 上运行这些 JAVA 字节码,JVM 解析这些字节码,映射到 CPU 指令集或 OS 的系统调用。

三者区别:

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

总结

  1. JRE 是运行时库,是提供给想运行 Java 程序的用户使用的;
  2. JDK 是开发工具包, 是提供给 Java 开发人员使用的;
  3. JDK包含了JRE, JRE包含了JVM。

 

更多精彩,请关注我的"今日头条号":Java云笔记
随时随地,让你拥有最新,最便捷的掌上云服务

  • 7
    点赞
  • 0
    评论
  • 18
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值