JDK 是包含开发工具的全功能包,JRE 是仅用于运行程序的精简版;JDK 自带 JRE,无需单独安装,且现代 JDK 默认只保留 server JVM 模式。

JDK 是开发用的“全功能包”,JRE 是运行用的“精简版”
本质区别就一句话:JDK 包含 JRE,但 JRE 不包含任何开发工具。如果你要写 Java 代码、编译 .java 文件、调试或分析字节码,必须用 JDK;如果只是双击运行别人打包好的 .jar 程序,装个 JRE 就够了。
现实中,绝大多数开发者直接装 JDK,因为:
- 它自带一个完整的 JRE(路径如 C:\Program Files\Java\jdk-21\jre 或新版中整合进 lib)
- 你不需要额外配置运行环境,java 命令默认走 JDK 自带的 JRE
- 避免出现“能编译不能运行”或“运行时版本不一致”的问题
为什么 JDK 里有两个 jvm.dll(或 libjvm.so)?
这不是冗余,而是设计使然。JDK 自带的 JRE 通常同时提供 client 和 server 两套 JVM 实现(尤其在旧版 JDK 中明显),对应不同场景:
-
clientJVM:启动快、内存占用小,适合桌面 GUI 应用或短生命周期程序 -
serverJVM:启动稍慢,但 JIT 优化更强,适合长期运行的服务端应用
现代 JDK(如 JDK 17+)已默认只保留 server 模式,但目录结构仍可能残留 client 文件夹——别删,否则某些工具链(如旧版 jvisualvm)可能报错找不到 JVM。
装了 JDK 还要单独装 JRE 吗?
完全没必要,而且容易出问题。
立即学习“Java免费学习笔记(深入)”;
常见错误现象:java -version 显示的是 JRE 的版本,而 javac -version 却报“不是内部或外部命令”——这往往是因为 PATH 指向了独立安装的 JRE 的 bin,而不是 JDK 的 bin。
正确做法是:
- 卸载所有独立的 JRE(除非有特殊遗留系统依赖)
- 把 JDK 的 bin 目录(如 C:\Program Files\Java\jdk-21.0.2\bin)加到系统 PATH
- 验证:java -version 和 javac -version 输出主版本号一致(如都是 21)
注意:Windows 下安装 JDK 时,它可能自动把 jre\bin 的 java.exe 复制到 C:\Windows\System32,这会干扰 PATH 判断——建议手动删掉该位置的 java.exe,避免隐性冲突。
JRE 的实际组成:不只是 jvm.dll + rt.jar
很多人以为 JRE 就是 JVM 加几个 class 文件,其实它还包含关键运行支撑组件:
-
JVM:含解释器、JIT 编译器、GC、运行时数据区(堆、方法区、栈等) - 核心类库:
java.lang、java.util、java.io等打包在lib\rt.jar(旧版)或lib\classes.jsa/lib\jmod(模块化后) - 本地库:
lib\ext下的扩展机制(已废弃)、lib\security中的策略与证书支持 - 运行时配置:
lib\security\java.policy、lib\tzdb.dat(时区数据)等
所以,哪怕你只部署一个 Spring Boot 的 .jar,底层也依赖整套 JRE 提供的这些能力——不是“有 JVM 就能跑”,而是“JRE 提供了 JVM 能正常工作的最小上下文”。
真正容易被忽略的是:不同 JDK 版本附带的 JRE 对 TLS 协议、加密算法、时区规则的支持存在细微差异。线上遇到 SSLHandshakeException 或 ZoneRulesException,有时根本不是代码问题,而是 JRE 版本太旧没更新 CA 证书或 IANA 时区数据。










