JDK vs JRE:到底有什么本质区别?99% 的人都答不上来

学 Java 时,我们经常会被两个概念绕晕:JDKJRE

很多人背下来一句话:

"JDK = JRE + 开发工具"。

但当被问到------JRE 到底是什么?JDK 比 JRE 多了哪些东西?它们在运行程序时的角色有什么不同?

多数人还是一脸懵。

本文将带你从 结构组成 → 工作原理 → 实际场景 三个层面彻底搞清楚它们的本质区别。


1. JDK 与 JRE 的官方定义

  • JRE(Java Runtime Environment) :Java 运行环境,包含运行 Java 程序所需的核心类库(Core Libraries)和 JVM。
  • JDK(Java Development Kit) :Java 开发工具包,包含 JRE 以及 编译、调试、打包等开发工具。

一句话:

JRE 负责"运行",JDK 负责"开发 + 运行"。


2. 结构对比

用一个结构图来看更直观:

nginx 复制代码
JDK
 ├── JRE
 │    ├── JVM(Java Virtual Machine)
 │    ├── 核心类库(rt.jar、charsets.jar 等)
 │    └── 运行时支持文件
 ├── 开发工具(javac、javadoc、jar、jdb 等)
 └── 其他辅助工具(jconsole、jvisualvm 等)

📌 关键点:

  • JVM:负责将字节码解释/编译为机器码并执行。
  • 核心类库 :包括 java.langjava.utiljava.io 等,Java 程序运行离不开它们。
  • 开发工具javac(编译器)、jar(打包)、javadoc(文档生成)等只在开发阶段使用。

3. 工作原理上的区别

假设你有一个 Java 源文件:

java 复制代码
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello Java");
    }
}

JDK 完成的流程:

  1. 编译阶段

    • 使用 javac Hello.java → 编译成 Hello.class(字节码文件)。
    • 需要 javac(属于 JDK,JRE 没有)。
  2. 运行阶段

    • 使用 java Hello → JVM 加载并执行字节码。
    • 需要 JVM + 核心类库(属于 JRE)。

如果你只有 JRE

  • 你可以运行 java Hello(前提是 Hello.class 已存在)。
  • 但你不能编译 Hello.java(因为缺少 javac)。

换句话说:

JDK = 可以开发 + 运行
JRE = 只能运行


4. 类比理解

我们可以用一个生活类比来理解:

  • JRE = 只有微波炉和食材的厨房 → 你可以加热和吃饭(运行程序)。
  • JDK = 厨房 + 菜刀、锅铲、调料 → 你既能做饭(编译程序),也能吃饭(运行程序)。

5. 在不同场景下的选择

场景 推荐安装
开发 Java 应用 JDK(包含所有开发工具和运行环境)
部署到服务器,只运行已编译程序 JRE(体积小、运行环境足够)
使用框架构建、调试、编译 JDK
纯运行环境(嵌入式、客户端运行) JRE

6. 自 JDK 11 之后的变化

Java 11 开始,Oracle 不再单独提供 JRE 下载包 ,只有 JDK 包。

如果你只需要运行 Java 程序,可以:

  • 安装 JDK,但只用里面的 java 命令。
  • 或者自己定制精简版运行时(用 jlink 生成)。

这意味着:

在新版本 Java 中,JDK 已经完全覆盖了 JRE 的功能,JRE 单独存在的意义在减少。


7. 总结记忆

对比点 JDK JRE
含 JVM
核心类库
编译器(javac)
开发工具
用途 开发 + 运行 运行

一句话记忆:

JRE 是运行时,JDK 是开发套件(包含 JRE)。


核心 takeaway

  • 运行程序 → 需要 JRE
  • 编写程序 → 需要 JDK(因为要编译)
  • 新版 JDK 自带运行功能,不必额外装 JRE。
相关推荐
CoderYanger6 分钟前
优选算法-字符串:63.二进制求和
java·开发语言·算法·leetcode·职场和发展·1024程序员节
3***31217 分钟前
java进阶1——JVM
java·开发语言·jvm
IT_陈寒15 分钟前
Python高手都在用的5个隐藏技巧,让你的代码效率提升50%
前端·人工智能·后端
FeiHuo5651519 分钟前
微信个人号开发中如何高效实现API二次开发
java·开发语言·python·微信
源码技术栈27 分钟前
什么是云门诊系统、云诊所系统?
java·vue.js·spring boot·源码·门诊·云门诊
Coder-coco36 分钟前
游戏助手|游戏攻略|基于SprinBoot+vue的游戏攻略系统小程序(源码+数据库+文档)
java·vue.js·spring boot·游戏·小程序·论文·游戏助手
Qiuner38 分钟前
Spring Boot 机制二:配置属性绑定 Binder 源码解析(ConfigurationProperties 全链路)
java·spring boot·后端·spring·binder
Victor35638 分钟前
Redis(151)Redis的内存使用如何监控?
后端
Victor35638 分钟前
Redis(150)Redis的性能瓶颈如何排查?
后端
D***77652 小时前
适用于IntelliJ IDEA 2024.1.2部署Tomcat的完整方法,以及笔者踩的坑,避免高血压,保姆级教程
java·tomcat·intellij-idea