【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署
JVM、JRE、JDK 是每个 Java 开发者绕不开的三个核心术语,但很多人在配置环境时仍然分不清"装哪个才对"。本文从核心定义出发,用俄罗斯套娃式的层级关系图理清三者的嵌套逻辑(JDK ⊃ JRE ⊃ JVM),配合对比表格、代码示例和三种真实场景(终端用户/开发者/运维诊断),讲透"谁在何时用什么"。同时纠正三个高频误区——为什么服务器不该装 JDK、为什么 JVM 不只跑 Java、为什么
【杂项知识点】JVM、JRE 与 JDK 的关系

🎬 博主名称: 超级苦力怕
🔥 个人专栏: 《基本功修炼大全》
🚀 每一次思考都是突破的前奏,每一次复盘都是精进的开始!
很多 Java 初学者在配置开发环境时分不清 JDK、JRE、JVM 三者的区别,面试中也经常被问到"装的是 JDK 还是 JRE"。本文用一张层级关系图 + 对比表格帮你一次搞懂它们的职能边界和包含关系,适合刚入门或准备面试的同学阅读。
一、核心概念定义
Java 实现"一次编写,到处运行"(Write Once, Run Anywhere),本质上依赖于 JVM、JRE 和 JDK 三层架构的协作。下面逐一拆解每个概念。
1.1 JVM(Java Virtual Machine)
JVM 即 Java 虚拟机,是 Java 程序的执行引擎。它是一台抽象的计算机,运行在物理硬件之上,为 .class 字节码提供统一的运行环境。核心职责包括四个方面:
- 执行引擎:加载、校验并执行编译后的字节码,不直接操作源码
- 内存管理与垃圾回收(GC):自动分配内存并回收无用对象,这是 Java 开发效率高于 C/C++ 的关键保障
- 跨平台性:针对 Windows、Linux、macOS 提供各自的 JVM 实现,屏蔽操作系统差异
- 安全防御:运行时进行严格的字节码校验,防止恶意代码破坏宿主机系统

1.2 JRE(Java Runtime Environment)
JRE 即 Java 运行时环境,是运行 Java 程序的最小集合。许多初学者以为 JRE 只是一个"静止"的环境,实际上它包含三个关键部分:
- JVM:核心执行引擎,负责字节码的实际运行
- 核心类库(Java API):预定义的功能包,如
java.lang(String、Object)、java.util(集合、Map)、java.io(输入输出流)、java.sql(数据库交互)等 - 运行时工具:如
java命令本身,负责启动 JVM 并加载必要类库

1.3 JDK(Java Development Kit)
JDK 即 Java 开发工具包,是面向开发者的全功能资源箱,包含开发、调试、测试所需的全部工具:
- JRE:确保代码写完就能立即运行
- 开发工具:编译器
javac、调试器jdb、监控工具JConsole、内存分析工具jhat、打包工具jar等 - 源码支持:附带 Java 标准类库的源代码,是进阶学习的权威参考

💡 核心结论: JDK 包含 JRE,JRE 包含 JVM。开发者安装 JDK 即可获得全部能力,终端用户只需 JRE 就能运行程序。
二、包含关系与层级模型
三者是层层嵌套的关系:
JDK(开发工具 + JRE)
└── JRE(核心类库 + 运行时工具 + JVM)
└── JVM(执行引擎)

2.1 为什么要区分它们?
从生产部署视角看,这种区分有切实的工程意义:
| 考量维度 | 说明 |
|---|---|
| 安全层面 | 服务器建议只装 JRE,不含 javac 和 jdb,缩小攻击面,防止入侵者编译运行恶意程序 |
| 资源层面 | JRE 比 JDK 更轻量,Docker 容器化部署时用 JRE 基础镜像可减少磁盘占用和传输成本 |
2.2 三者对比表
| 维度 | JVM | JRE | JDK |
|---|---|---|---|
| 主要功能 | 执行字节码、内存管理 | 提供程序运行的完整环境 | 编写、编译、调试、运行程序 |
| 包含组件 | 执行引擎、GC、安全检查 | JVM + 核心类库 + 运行工具 | JRE + 编译器 + 监控工具 + 源码 |
| 目标用户 | 跨平台实现者 | 终端用户(仅运行程序) | Java 开发者 |
| 是否独立安装 | 随 JRE / JDK 附带 | 可独立安装 | 开发者必须安装 |
💡 核心结论: 区分三者不仅是面试需要,更直接影响生产环境的安全部署和资源规划。
三、场景应用示例
3.1 终端用户:运行现有应用
只需运行 .jar 程序或 Java 游戏时,安装 JRE 即可。JRE 内的 JVM 会将 .class 字节码与核心类库结合,把开发者调用的 System.out 等 API 与底层指令对接,程序即可正常运行。
3.2 开发者:从零构建
编写 HelloWorld.java 时必须安装 JDK——你需要 javac 编译源码、java 启动程序、jdb 调试 Bug。
✅ 编译与运行示例
// HelloWorld.java — 需要 JDK 来编译和运行
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, JVM!");
}
}
✅ 命令行操作
# 编译:javac 将 .java 转为 .class 字节码(只有 JDK 提供)
javac HelloWorld.java
# 运行:java 命令启动 JVM 加载字节码
java HelloWorld
3.3 运维诊断:性能监控
线上程序出现 CPU 飙升或内存泄漏时,需要 JDK 内置工具进行诊断:
| 工具 | 用途 | JRE 是否包含 |
|---|---|---|
JConsole |
图形化内存 / 线程监控 | 否 |
jhat |
堆快照分析 | 否 |
jdb |
断点调试 | 否 |
java |
启动程序 | 是 |
💡 核心结论: 诊断工具是 JDK 专有的,生产服务器如果只装了 JRE,出问题时将无法现场分析。
四、常见误区
⚠️ 误区一:运行 Java 程序必须安装完整的 JDK
正确理解: 运行程序只需 JRE。生产服务器装 JDK 不仅浪费空间,更会因暴露编译工具带来安全风险。
⚠️ 误区二:JVM 只能运行 Java 语言编写的程序
正确理解: JVM 是字节码平台,不关心源码语言。只要编译成规范的 .class 字节码即可运行,这正是 Kotlin、Scala、Groovy 等语言能与 Java 共享生态的原因。
⚠️ 误区三:JRE 只是类库的集合,不包含执行工具
正确理解: JRE 必须包含 java 等运行时启动工具,否则无法引导 JVM 加载类库并启动程序。
五、扩展阅读
| 资源 | 说明 |
|---|---|
| Oracle JDK 官方文档 | JDK 工具、API 的权威参考 |
| JVM Specification | JVM 字节码指令集、类文件格式的官方规范 |
| OpenJDK | JDK 开源实现,可阅读 HotSpot 虚拟机源码 |
六、总结

核心要点:
- JDK 包含 JRE,JRE 包含 JVM — 层层嵌套,向上兼容,装 JDK 就不用单独装 JRE
- 开发用 JDK,运行用 JRE — 生产环境尽量只装 JRE,安全且轻量
- JVM 是跨语言平台 — 不限于 Java,任何编译成字节码的语言都能运行

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)