Skip to content

JVM、JRE、JDK 到底是什么区别

搜过 "jvm full form"、"JVM 和 JDK 有什么区别" 的同学,看完这一页就再也不会混淆了。

JVM — Java 虚拟机

JVM(Java Virtual Machine) 是真正运行 Java 代码的程序。Java 工具链的工作方式是:

  1. JDK 里的 javac.java 源码编译成字节码.class 文件)。
  2. JVM 加载字节码、校验、执行——通过解释器 + JIT 即时编译把字节码翻译成本地机器指令。
  3. 运行期间,JVM 为应用管理内存:在堆上分配对象,并用垃圾回收(GC)回收死对象。

每个操作系统都有自己的 JVM 实现(Windows / Linux / macOS…),所以同一份字节码到处能跑——这就是"一次编写,到处运行"。

JRE — Java 运行时环境

JRE = JVM + 运行所需的核心类库(java.langjava.util、网络与 IO 等)。只想运行 Java 程序的话,JRE 就够了。

Java 11 之后

Oracle 不再单独提供 JRE 下载——现代 JDK(11、17、21、25)可以直接用 java 命令运行程序,还能用 jlink 裁剪出精简运行时。

JDK — Java 开发工具包

JDK = 完整工具箱:JRE + 开发工具——javac(编译器)、jdb(调试器)、jmap(堆转储)、jstack(线程转储)、jcmd 等。 Java 代码就需要 JDK。

一张图看懂

┌─────────────────────────────┐
│ JDK                         │
│  ┌───────────────────────┐  │
│  │ JRE                   │  │
│  │  ┌─────────────────┐  │  │
│  │  │ JVM             │  │  │
│  │  │  + 类加载器      │  │  │
│  │  │  + 字节码解释器  │  │  │
│  │  │  + JIT 编译器   │  │  │
│  │  │  + GC 引擎      │  │  │
│  │  └─────────────────┘  │  │
│  │  + 核心类库            │  │
│  └───────────────────────┘  │
│  + javac / jmap / jstack …  │
└─────────────────────────────┘

JDK ⊃ JRE ⊃ JVM。 JDK 既能编译又能运行;JRE 只能运行。

垃圾回收发生在哪里

JVM 把内存划分为若干区域,与 GC 相关的核心是:

区域存放内容谁来清理
年轻代(Eden + Survivor)新建对象,大多数朝生夕死Minor / Young GC——频繁、快
老年代撑过多次回收的长命对象Major / Full GC——代价高
元空间类元数据满了触发 Full GC

年轻代满时,JVM 会暂停应用线程进行回收——这就是日志里看到的 GC 停顿。停顿频繁或过长,用户就能感知到卡顿。

分析你 JVM 的 GC 行为

GC 日志就是 JVM 的行车记录仪。把日志拖进 GC 日志分析器,几秒钟看到吞吐量、停顿、分配速率与泄漏信号。

相关文章