【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署

【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署

这是很多 Java 开发者初学时最容易混淆的三个概念。理清楚它们的关系,是走向专业开发的必经之路。

1. 三者核心定义与包含关系

名称全称作用是否包含 JVM包含内容目标用户
JDKJava Development Kit开发 + 运行JRE + 开发工具(javac、jdb、javadoc、jshell 等)开发者
JREJava Runtime Environment仅运行JVM + 核心类库(rt.jar / lib 等)普通用户 / 生产环境
JVMJava 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.basejava.langjava.util 等)。
  • 普通用户安装 JRE 就能运行 .jar 程序。
  • 现代趋势:JRE 已不再单独发布(从 JDK 9 开始),推荐使用 jlink 定制最小运行时。

JDK(Java 开发工具包)

  • 包含 JRE + 开发工具:
  • javac:编译器(.java → .class)
  • java:运行工具
  • jar:打包工具
  • javadocjavapjpsjmapjstack 等诊断工具
  • 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 / Kubernetesdistroless 或 slim 镜像 + jlink极小最快最高最佳实践
云函数 / ServerlessGraalVM Native Image极小闪电冷启动友好
传统胖 JARJDK 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 工程化的大门!有什么具体困惑或想深入的部分,告诉我。

文章已创建 5321

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部