💬 “刚学Java的时候,看到JDK、JRE、JVM三者关系,完全不知道从哪下手…”
💬 “看视频跟着敲代码,一离开视频就忘了怎么写,感觉脑子和手不同步”
💬 “查了半天资料,每个教程说法都不一样,越查越懵”
如果你也中过上面的枪,那这篇文章就是为你准备的。
花了一整天时间,我把这个知识点彻底梳理了一遍。看完这篇,你也能搞懂JDK、JRE、JVM三者关系。
被这三个词绕晕的那些日子
刚学 Java 那会儿,JDK、JRE、JVM 这三个词就像三胞胎,看着眼熟,一问就懵:
- 一开始以为JDK就是JVM,都是跑程序的。
- 后来发现不对,JDK好像比JVM大不少。
- 再后来听说 JRE 包含 JVM,那 JRE 和 JDK 又是什么关系?
- 最后彻底晕了:“JDK包含JRE,JRE包含JVM”???
最要命的是,javac 和 java 这两个命令到底是干啥的?为什么有时候能编译不能运行,有时候能运行不能编译?
别笑,这些都是我曾经的真实困惑。今天咱们就一次性彻底搞明白!
用装修房子打个比方,一下就通了
想象你要装修一套房子:
毛坯房 = JVM(只提供基础能力)
- 只有水泥墙、水电管道。
- 理论上“能住”,其实只能看看样子。
精装房 = JRE(包含了住进去的基本条件)
- 地板铺好了,家电配齐了,床也摆上了。
- 你可以住进去了,但没法装修新东西。
装修材料+工具箱 = JDK(包含了工具齐全的装修材料库)
- 有锤子、螺丝刀、电钻、油漆。
- 你不仅能住,还能改造成你喜欢的样子。
换成Java开发:
| 比方 | Java世界 | 实际内容 |
|---|---|---|
| 毛坯房 | JVM | 执行字节码的虚拟机 |
| 精装房 | JRE | JVM + 核心类库(能运行Java程序) |
| 装修材料+工具箱 | JDK | JRE + 开发工具(能写Java程序) |
JVM:Java 的“心脏”
什么是JVM?
JVM = Java Virtual Machine(Java虚拟机)
它是Java能够"一次编写,到处运行"的核心!简单来说:
- JVM是一个安装在电脑上的程序。
- 它能理解和执行 Java字节码(
.class文件)。 - 不同的操作系统有不同版本的JVM实现,但对Java编写程序的执行结果是一致的。
JVM的主要功能
1. 加载字节码
// Java源代码
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
// 使用 javac 编译后变成 Hello.class,JVM 负责把它读进内存
2. 执行字节码并翻译成机器指令
3. 内存管理(垃圾回收)
String s = new String("Hello"); // 创建对象
s = null; // 没人引用了,JVM会自动回收; 不用像 C 语言一样手动 free,爽不爽?
4. 跨平台适配
- Windows有Windows版JVM
- Mac有Mac版JVM
- Linux有Linux版JVM
- 但
.class文件只有一个,到处都能跑!
JVM的组成结构
JRE:只负责“运行”的最小环境
什么是JRE?
JRE = Java Runtime Environment(Java运行时环境)
公式:JRE = JVM + 核心类库
JRE包含什么?
| 组件 | 说明 |
|---|---|
| JVM | 虚拟机,执行字节码 |
| 核心类库 | 常用的类,如String、ArrayList、HashMap等 |
| 支持文件 | 配置文件、字体、资源文件等 |
核心类库举例:
// 这些类都在JRE的核心类库里
import java.util.List; // 集合类
import java.io.FileInputStream; // IO类
import java.net.Socket; // 网络类
import java.sql.Connection; // 数据库类
JRE能做什么?不能做什么?
能做的:
- ✅ 运行已经编译好的Java程序(
.jar文件) - ✅ 执行别人写好的Java工具
- ✅ 运行Java Web应用(Tomcat等)
不能做的:
- ❌ 编译Java源代码(需要javac)
- ❌ 生成Java文档(需要javadoc)
- ❌ 调试Java程序(需要jdb)
JDK:程序员的“瑞士军刀”
什么是JDK?
JDK = Java Development Kit(Java开发工具包)
公式:JDK = JRE + 开发工具
如果说JRE是"精装房能住人",那JDK就是"给你全套工具让你能装修"!
JDK包含什么?
JDK 安装目录
├── bin/ ← 开发工具(最常用)
│ ├── javac ← 编译器(把 .java 变成 .class)
│ ├── java ← 运行器(执行 .class)
│ ├── javadoc ← 文档生成器
│ ├── jar ← 打包工具
│ ├── jdb ← 调试器
│ └── javap ← 反编译查看器
├── lib/ ← 类库文件
├── include/ ← C/C++ 头文件
└── jmods/ ← 模块化文件
javac和java的区别
这两个是最常用的命令,必须搞清楚!
| 命令 | 作用 | 输入 | 输出 |
|---|---|---|---|
javac | 编译器 | .java源文件 | .class字节码 |
java | 运行器 | .class字节码 | 程序执行结果 |
实际使用:
# 第一步:编译(把人类能懂的源码变成 JVM 能懂的字节码)
javac Hello.java
# 第二步:运行(让 JVM 执行字节码)
java Hello
💡 避坑提醒:
javac负责"翻译",java负责"执行"。没有javac编译的.class文件是没法运行的。java命令后面不要加.class后缀,直接写类名就行。写成java Hello.class是会报错的!
JDK/JRE/JVM完整关系图
总结
| 概念 | 一句话解释 |
|---|---|
| JVM | 执行字节码的虚拟心脏,跨平台的基石 |
| JRE | JVM + 核心类库,能运行但不能开发 |
| JDK | JRE + 全套开发工具,程序员吃饭的家伙 |
终极口诀:JVM 是内核,JRE 是运行壳,JDK 是开发全家桶。学 Java,装 JDK 一步到位!
💡 与君共勉
写这篇文章的时候,想起自学Java的过程。有几点心得想分享给你:
- 不要急于求成 - 学习是一个循序渐进的过程,今天的困惑都是明天的积累。
- 别怕折腾 - 环境崩了就重装,报错就搜,踩坑才是真学习。
- 多动手敲代码 - 看十遍视频不如敲一遍代码,实践出真知。
- 建立知识体系 - Java是一整套体系,要慢慢把知识点串起来。
如果你觉得这篇文章对你有帮助,点个赞告诉我,让我知道我的分享是有价值的。有任何疑惑,欢迎在评论区留言,我看到都会回复。