【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署
这是很多 Java 开发者初学时最容易混淆的三个概念。理清楚它们的关系,是走向专业开发的必经之路。
1. 三者核心定义与包含关系
| 名称 | 全称 | 作用 | 是否包含 JVM | 包含内容 | 目标用户 |
|---|---|---|---|---|---|
| JDK | Java Development Kit | 开发 + 运行 | 是 | JRE + 开发工具(javac、jdb、javadoc、jshell 等) | 开发者 |
| JRE | Java Runtime Environment | 仅运行 | 是 | JVM + 核心类库(rt.jar / lib 等) | 普通用户 / 生产环境 |
| JVM | Java Virtual Machine | 执行字节码 | 本身 | 解释器、JIT、GC、类加载器、内存管理等 | 底层执行引擎 |
包含关系(最重要的一张图):
JDK
└── JRE
└── JVM
- JDK = 开发工具包(最大)
- JRE = 运行环境(中间)
- JVM = 执行引擎(核心,最小)
一句话记忆:
JVM 是心脏,JRE 是身体,JDK 是带工具箱的身体。
2. 各组件详细拆解
JVM(Java 虚拟机)
- 本质:一个抽象的计算机,遵守《Java 虚拟机规范》。
- 核心功能:
- 类加载子系统(ClassLoader)
- 运行时数据区(栈、堆、方法区、PC 寄存器、本地方法栈)
- 执行引擎(解释器 + JIT 即时编译器)
- 垃圾回收器(GC)
- 本地方法接口(JNI)
- 特点:一次编译,到处运行(Write Once, Run Anywhere)依赖于不同平台有不同的 JVM 实现。
- 常见实现:HotSpot(Oracle/OpenJDK 默认)、GraalVM、OpenJ9 等。
JRE(Java 运行时环境)
- 包含 JVM + Java 标准类库(
java.base、java.lang、java.util等)。 - 普通用户安装 JRE 就能运行
.jar程序。 - 现代趋势:JRE 已不再单独发布(从 JDK 9 开始),推荐使用
jlink定制最小运行时。
JDK(Java 开发工具包)
- 包含 JRE + 开发工具:
javac:编译器(.java → .class)java:运行工具jar:打包工具javadoc、javap、jps、jmap、jstack等诊断工具jshell(REPL,从 JDK 9)- 不同发行版:Oracle JDK、OpenJDK、Adoptium Temurin、Amazon Corretto、Azul Zulu 等。
3. 常见概念混淆解答
Q1:安装 JDK 就能开发和运行,是不是就不需要 JRE 了?
是的。JDK 已经包含了完整的 JRE。
Q2:生产服务器上应该装 JDK 还是 JRE?
强烈推荐只装 JRE(或更小的自定义运行时)。
原因:
- JDK 体积更大,包含不必要的编译器和调试工具。
- 安全风险更高(更多攻击面)。
- 生产环境不需要编译功能。
Q3:java -version 显示的是什么?
显示的是当前使用的 JDK/JRE 的版本和实现(包含 JVM 信息)。
4. 生产部署最佳实践(2026 年最新推荐)
当前推荐版本(2026 年 5 月)
- LTS 版本(企业首选):JDK 21(仍在维护)、JDK 25(最新 LTS,2025 年 9 月发布,支持至 2030 年)。
- 短期版本:JDK 26(2026 年 3 月发布,仅支持 6 个月)。
部署方式对比
| 部署方式 | 推荐方案 | 体积 | 启动速度 | 安全性 | 说明 |
|---|---|---|---|---|---|
| 传统服务器 | 自定义 JRE(jlink) | 最小 | 快 | 高 | 强烈推荐 |
| Docker / Kubernetes | distroless 或 slim 镜像 + jlink | 极小 | 最快 | 最高 | 最佳实践 |
| 云函数 / Serverless | GraalVM Native Image | 极小 | 闪电 | 高 | 冷启动友好 |
| 传统胖 JAR | JDK 21/25 全量 | 大 | 一般 | 中 | 不推荐 |
推荐生产镜像构建命令(jlink):
# 生成最小自定义 JRE
jlink --add-modules java.base,java.logging,java.sql \
--output custom-jre \
--strip-debug \
--no-header-files \
--no-man-pages \
--compress=2
然后在 Dockerfile 中:
FROM debian:slim
COPY custom-jre /opt/java
COPY app.jar /app/
ENV JAVA_HOME=/opt/java
CMD ["/opt/java/bin/java", "-jar", "/app/app.jar"]
5. 实用命令与诊断
java -version # 查看版本
javac -version # 查看编译器版本
jps # 查看 Java 进程
jinfo <pid> # 查看 JVM 参数
jmap -heap <pid> # 堆信息
jstack <pid> # 线程栈
常用 JVM 参数(生产必备):
-Xms512m -Xmx2g # 堆大小
-XX:+UseG1GC # 垃圾回收器
-XX:MaxGCPauseMillis=200
--add-opens java.base/java.lang=ALL-UNNAMED # 模块化打开反射
6. 总结记忆口诀
- 开发用 JDK(本地电脑装 JDK)
- 运行用 JRE(服务器尽量只装运行时)
- 核心是 JVM(所有 Java 程序最终都在 JVM 上跑)
一句话总结:
JDK 是给程序员用的工具箱,JRE 是给用户跑程序的运行库,而 JVM 是让 Java 实现跨平台的灵魂引擎。
后续延伸推荐(需要哪一篇随时说):
- 深入 JVM 内存结构与 GC 调优
- Java 模块化系统(JPMS / Module)
- GraalVM 与 Native Image 实战
- OpenJDK vs Oracle JDK 选择指南
- Docker + Java 多阶段构建最佳实践
掌握了这三个概念,你就真正迈入了 Java 工程化的大门!有什么具体困惑或想深入的部分,告诉我。