JDK、JRE、JVM的区别

不少人(包括我)在初学JAVA时常常会分不清或者记不住什么是JDK、JRE和JVM,但是这几个词又会时常出现,因此有必要彻底区分名了解这三者是什么。


首先贴一张图说明上着之间的关系

JDK、JRE、JVM三者的区别与联系 - 以德糊人 - ——挨踢民工 Playkid——


一、JDK(Java Development Kit)

  JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品。
  JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。
  JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
  ①SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从JDK 5.0开始,改名为Java SE。
  ②EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,改名为Java EE。

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


二、Java Runtime Environment(JRE)
  是运行基于Java语言编写的程序所不可缺少的运行环境。也是通过它,Java的开发者才得以将自己开发的程序发布到用户手中,让用户使用。
  RE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,这些是运行Java程序的必要组件。
  与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。


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


总结上面所说的,JDK包含JRE、JVM,是开发人员必须安装的开发工具包,而JRE则是JAVA运行环境,当我们不需要开发JAVA程序,而仅仅需要让JAVA程序运行起来时就可以只安装JRE。


JDK、JRE、JVM三者的区别与联系 - 以德糊人 - ——挨踢民工 Playkid——

最后再贴一张三者的包含关系图

### JDKJRE JVM 的关系与区别 #### 1. **定义** - **JVM (Java Virtual Machine)** JVM 是一种抽象的计算机,它是 Java 程序的实际运行环境。其主要功能包括加载字节码、验证字节码、执行字节码以及提供内存管理垃圾回收等功能[^2]。通过 JVMJava 实现了“一次编写,到处运行”的特性。 - **JRE (Java Runtime Environment)** JREJava 运行时环境,包含了运行 Java 应用程序所需的一切资源,其中包括 JVM 核心类库(如 `rt.jar`)。因此,JRE 提供了一个完整的运行环境来执行 `.class` 文件[^1]。 - **JDK (Java Development Kit)** JDKJava 开发工具包,专为开发者设计。它不仅包含 JRE 中的所有组件,还提供了额外的开发工具,例如编译器 (`javac`)、打包工具 (`jar`) 文档生成工具 (`javadoc`) 等。这些工具帮助开发者创建调试 Java 应用程序[^1]。 --- #### 2. **区别** | 特性 | **JVM** | **JRE** | **JDK** | |-----------------|---------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------| | 主要用途 | 执行 Java 字节码 | 提供运行 Java 应用所需的完整环境 | 提供开发运行 Java 应用的全套工具 | | 是否独立存在 | 不可以单独存在,依赖于 JRE 或其他实现 | 可以独立安装并运行 | 包含 JRE,可以直接运行应用 | | 关键组成部分 | 加载器、解释器、垃圾收集器 | JVM + 核心类库 | 编译器 (`javac`)、打包工具 (`jar`)、调试工具等 | | 面向人群 | 用户无需关心 | 终端用户 | 开发人员 | 具体来说: - **JDK vs JRE**: JDK 包括 JRE 并扩展了它的功能,增加了许多开发工具。对于终端用户而言,只需安装 JRE 即可运行 Java 应用;而对于开发者,则需要安装 JDK 来构建应用程序[^1]。 - **JRE vs JVM**: JRE 是一个更全面的概念,除了包含 JVM 外,还包括标准库其他支持文件。如果缺少 JRE 下的类库(如 `rt.jar`),即使有 JVM 也无法正常运行 Java 程序。 --- #### 3. **关系** - **层次结构**: JDKJREJVM JDK 包含 JRE,而 JRE 则进一步封装了 JVM 必要的类库。这意味着,当开发者使用 JDK 创建的应用被部署到用户的机器上时,实际上只依赖于目标机器上的 JRE 或其中的 JVM[^3]。 - **协作机制**: 当开发者写好一段 Java 源代码后,会先利用 JDK 中的 `javac` 将源代码编译成字节码(`.class` 文件)。随后,在运行阶段,由 JRE 中的 JVM 解析并执行该字节码。整个过程体现了三者的紧密合作。 --- ```python # 示例:如何使用 JDK 工具完成简单的 Java 开发流程 # 假设有一个名为 HelloWorld.java 的简单程序 print("Hello, World!") # 使用 javac 编译 !javac HelloWorld.java # 使用 java 命令运行编译后的 .class 文件 !java HelloWorld ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值