社交媒体

JDK、JRE、JVM 一张图讲清楚

JDK、JRE、JVM 一张图讲清楚
先看一条报错,装过 Java 的人一半都见过它:

```text
C:\Users\你> javac Hello.java
'javac' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
```

![image.png](/upload/image.png)

奇怪的是,`java -version` 明明能输出版本号——说明机器上"有 Java",但 `javac` 就是找不到。

**十有八九,你装的是 JRE,不是 JDK。** 这俩不是同一个东西。今天这篇把它们和 JVM 的关系一次讲清楚,这是学 Java 的第一块地基。

## 01 一张图:三层套娃关系

记住一句话就够了:**JDK 包含 JRE,JRE 包含 JVM。**

| 名称 | 全称                     | 一句话解释                                                                       | 给谁用         |
| ---- | ------------------------ | -------------------------------------------------------------------------------- | -------------- |
| JDK  | Java Development Kit     | Java 开发工具包 = JRE + 开发工具(javac 编译器、jdb 调试器、javadoc 文档工具…) | 写代码的人     |
| JRE  | Java Runtime Environment | Java 运行环境 = JVM + 核心类库(String、集合这些别人写好的轮子)                 | 只运行程序的人 |
| JVM  | Java Virtual Machine     | Java 虚拟机,真正执行代码的引擎                                                  | ——           |

一个类比:JVM 是发动机,JRE 是一台能开走的整车,JDK 是整车外加一整个修理厂。**你以后要"造车"(写代码),所以必须装 JDK。**

![01-JDK-JRE-JVM嵌套框图.png](/upload/01-JDK-JRE-JVM%E5%B5%8C%E5%A5%97%E6%A1%86%E5%9B%BE.png)

## 02 你的代码是怎么跑起来的(三步)

```text
Hello.java(你写的源码)
    ↓  javac 编译
Hello.class(字节码,和操作系统无关)
    ↓  JVM 解释执行
屏幕上输出 Hello World
```

**字节码是关键**:它不挑操作系统,Windows 和 Linux 上的 Hello.class 是同一个文件。跨平台的是 JVM——每个系统装自己的 JVM,负责把同一份字节码翻译成各自系统的机器指令。

这就是"一次编译,到处运行"的真相:**到处跑的不是你的代码,是字节码 + 各地版本的 JVM。**

<!-- 配图未匹配到文件:编译执行三步流程图(推荐)(请手动补图) -->

## 03 三个坑,先记下来

**坑 1:装了 JRE,javac 不存在**

回到开头的报错。JRE 里只有"运行"用的 java 命令,没有"编译"用的 javac。去控制面板看看你装的是哪个——装的是 JRE,卸掉换 JDK。

**坑 2:java -version 有输出 ≠ 装好了**

<!-- 此处原为人工截图插槽:验货命令截图(人工插槽,必做) -->

验货命令是 `javac -version`,两个都能输出版本号,才算 JDK 装到位。

**坑 3:JDK 11 之后没有单独的 JRE 了**

从 JDK 11 起,官方不再单独发布 JRE(用 jlink 按需打包运行时)。所以现在网上让你"先装 JRE 再装 JDK"的教程,基本都是老黄历——**直接装 JDK,一步到位。**

橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。