简体中文
JVM、JRE、JDK 到底是什么区别
搜过 "jvm full form"、"JVM 和 JDK 有什么区别" 的同学,看完这一页就再也不会混淆了。
JVM — Java 虚拟机
JVM(Java Virtual Machine) 是真正运行 Java 代码的程序。Java 工具链的工作方式是:
- JDK 里的
javac把.java源码编译成字节码(.class文件)。 - JVM 加载字节码、校验、执行——通过解释器 + JIT 即时编译把字节码翻译成本地机器指令。
- 运行期间,JVM 为应用管理内存:在堆上分配对象,并用垃圾回收(GC)回收死对象。
每个操作系统都有自己的 JVM 实现(Windows / Linux / macOS…),所以同一份字节码到处能跑——这就是"一次编写,到处运行"。
JRE — Java 运行时环境
JRE = JVM + 运行所需的核心类库(java.lang、java.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 日志分析器,几秒钟看到吞吐量、停顿、分配速率与泄漏信号。