JVM/JRE/JDK 区别
初学 Java 时,经常被 JVM、JRE、JDK 搞得晕头转向。开发环境装的是哪个?生产环境又该装哪个?理解这三个概念,才能正确配置开发环境。
三者关系
┌─────────────────────────────────────────────────────────────┐
│ JDK │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ JRE │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ JVM │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Java 类库 (API) │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ 开发工具 │ │
│ │ javac / jar / javadoc 等 │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘快速对比
| 对比项 | JVM | JRE | JDK |
|---|---|---|---|
| 定义 | Java 虚拟机 | Java 运行时环境 | Java 开发工具包 |
| 功能 | 运行字节码 | 运行 Java 程序 | 开发 Java 程序 |
| 包含 JVM | ✅ 核心 | ✅ | ✅ |
| 包含类库 | ❌ | ✅ | ✅ |
| 包含编译器 | ❌ | ❌ | ✅ |
JVM
Java 虚拟机,是 Java 程序运行的抽象环境。核心组件包括类加载器(加载 .class 文件到内存)、运行时数据区(管理内存)、执行引擎(解释执行或 JIT 编译)、本地接口(调用本地方法)。
源代码(.java) → javac 编译 → 字节码(.class) → JVM 执行 → 本地机器码JVM 是跨平台的关键、自动垃圾回收的基础、安全机制的保障。
JRE
Java 运行时环境,包含 JVM 和 Java 类库(java.lang、java.util 等核心 API)。
用户运行 Java 程序,只需要 JRE。
JDK
Java 开发工具包,包含 JRE + 开发工具(javac 编译器、jar 打包工具、javadoc 文档生成器、jdb 调试器)。
开发者编写 Java 程序,需要 JDK。
使用场景
| 场景 | 安装内容 | 原因 |
|---|---|---|
| Java 开发者 | JDK | 需要编译、调试 |
| 普通用户运行程序 | JRE | 只需要运行 |
| 生产服务器 | JRE 或精简 JDK | 更小、更安全 |
| 构建服务器 | JDK | 需要编译打包 |
一句话总结
JDK = JRE + 开发工具
JRE = JVM + 类库
JVM = 执行字节码后续可阅读:Java 程序运行机制、编译型 vs 解释型、跨平台原理
