JDK、JRE 与 JVM 深度解析:核心区别、协作关系与工作原理
什么是 Java 开发工具包 (JDK)?
JDK 是让开发者编写、编译、调试、运行 Java 应用的完整工具包。包含 Java 编译器 (javac)、核心类库、调试器、JavaDoc 等开发工具。支持 Windows/macOS/Linux/Solaris,多版本可共存。
什么是 Java 运行时环境 (JRE)?
JRE 是运行 Java 程序的运行时包。包含 JVM、核心类库、支持文件。仅需运行 Java 应用的非开发者可只安装 JRE。
什么是 Java 虚拟机 (JVM)?
JVM 是将 Java 字节码解释或 JIT 编译为本机机器码的执行引擎。它是 Java 平台核心,提供跨平台执行、内存管理、安全机制。
为什么使用 JDK?
- 包含编译器、调试器、启动器等构建工具。
- 生成可在任何 JVM 运行的字节码。
- 提供性能调优、代码分析、文档生成工具。
为什么使用 JRE?
- 提供即开即用的运行环境,无开发工具开销。
- 包含大多数 Java 程序所需的完整核心库。
- 适合仅需运行不开发 Java 软件的最终用户。
为什么使用 JVM?
- 在任何兼容平台运行字节码,实现“一次编写,到处运行”。
- JIT 编译器运行时优化热点代码。
- 管理内存分配、垃圾回收、安全检查。
JDK 核心特性
- 完整开发工具链:编译器、调试器、JavaDoc 等。
- 支持现代语言特性(如泛型钻石操作符
<>)。 - 跨平台:Windows/macOS/Linux/Solaris 均可安装。
- 包含完整 JRE,是 JRE 的超集。
JRE 核心特性
- 包含 JVM 与运行 Java 应用所需的核心类库。
- 提供 Java Web Start、Java Plug-in 等部署技术。
- 包含 JDBC、RMI、JNDI 等网络/数据库 API。
- 不含开发工具,体量轻量。
JVM 核心特性
- 解释字节码或 JIT 编译热点代码。
- 管理内存、GC、安全策略。
- 灵活架构:类加载器、方法区、堆、栈、PC 寄存器、执行引擎、本地接口/库。
- 硬件无关:同字节码在任何兼容 JVM 运行。
JDK 工作原理
JDK 集成 JRE 并添加开发工具。开发者编写代码,javac 编译为字节码,Java 启动器 (java) 启动 JVM 执行。
JRE 工作原理
JRE 包含 JVM、类加载器、运行时库。程序启动时,JVM 加载类、验证字节码、通过解释器或 JIT 执行。
JVM 工作原理
JVM 核心组件:
- 类加载器:加载、链接、初始化类文件。
- 方法区:存储类结构、静态变量、方法字节码。
- 堆:存放对象和数组,线程共享。
- Java 栈:每线程私有,存局部变量、方法帧。
- PC 寄存器:记录每线程当前指令地址。
- 执行引擎:执行字节码,JIT 编译热点。
- 本地接口/库:集成原生代码。
JDK、JRE、JVM 对比总结
| 组件 | 全称 | 用途 | 平台相关性 | 包含工具 |
|---|---|---|---|---|
| JDK | Java Development Kit | Java 应用完整开发环境 | 平台相关 | 编译器、调试器、JavaDoc 等 |
| JRE | Java Runtime Environment | 提供核心库和 JVM 运行 Java 应用 | 平台相关 | 无(仅运行时) |
| JVM | Java Virtual Machine | 执行字节码;提供平台无关运行时 | 平台相关(实现各异) | 无(仅执行引擎) |
包含关系
JDK ⊃ JRE ⊃ JVM:JDK 包含完整 JRE,JRE 包含 JVM。开发装 JDK,运行装 JRE,JVM 是底层执行核心。
java
- Java日志最佳实践:三大核心原则构建可观测的可靠代码
- 理解 Java:JDK、JRE 和 JVM 详解
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java super 关键字:高级用法与实战示例
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 10 统一 JDK 仓库:单一代码库简化开发流程
- Java 10 线程局部握手:无需全局安全点的单线程暂停