🎬 博主名称: 超级苦力怕

🔥 个人专栏: 《基本功修炼大全》

🚀 每一次思考都是突破的前奏,每一次复盘都是精进的开始!


很多 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 实现,屏蔽操作系统差异
  • 安全防御:运行时进行严格的字节码校验,防止恶意代码破坏宿主机系统

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 并加载必要类库

JRE简介介绍

1.3 JDK(Java Development Kit)

JDK 即 Java 开发工具包,是面向开发者的全功能资源箱,包含开发、调试、测试所需的全部工具:

  • JRE:确保代码写完就能立即运行
  • 开发工具:编译器 javac、调试器 jdb、监控工具 JConsole、内存分析工具 jhat、打包工具 jar
  • 源码支持:附带 Java 标准类库的源代码,是进阶学习的权威参考

JDK简介介绍

💡 核心结论: JDK 包含 JRE,JRE 包含 JVM。开发者安装 JDK 即可获得全部能力,终端用户只需 JRE 就能运行程序。


二、包含关系与层级模型

三者是层层嵌套的关系:

JDK(开发工具 + JRE)
  └── JRE(核心类库 + 运行时工具 + JVM)
        └── JVM(执行引擎)

俄罗斯套娃法则展示JDKJREJVM

2.1 为什么要区分它们?

从生产部署视角看,这种区分有切实的工程意义:

考量维度 说明
安全层面 服务器建议只装 JRE,不含 javacjdb,缩小攻击面,防止入侵者编译运行恶意程序
资源层面 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 虚拟机源码

六、总结

总结一览

核心要点:

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

结尾配图

Logo

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

更多推荐