什么是 JVM? JVM (Java Virtual Machine)
JVM(Java Virtual Machine,Java 虚拟机)是一个虚构出来的计算机,它是一种规范,有自己的指令集,并且在运行时操作各种内存区域。JVM 是 Java 平台的核心组成部分,负责执行 Java 字节码(.class 文件)。
主要功能:
- 加载类文件: JVM 的类加载器(ClassLoader)负责从文件系统、网络或其他来源加载 Java 类文件(.class 文件)。
- 管理内存: JVM 负责管理程序的内存,包括:
- 堆 (Heap): 存放对象实例。
- 方法区 (Method Area): 存放类信息、常量、静态变量、即时编译器编译后的代码等。
- 虚拟机栈 (VM Stack): 存放局部变量、方法参数、返回值等。每个线程都有自己的虚拟机栈。
- 本地方法栈 (Native Method Stack): 用于支持 native 方法(使用 C、C++ 等编写的方法)的执行。
- 程序计数器 (Program Counter Register): 记录当前线程正在执行的字节码指令的地址。
- 执行字节码: JVM 的执行引擎负责执行 Java 字节码指令。
- 解释执行: 逐条解释执行字节码指令。
- 即时编译 (JIT Compilation): 将热点代码(经常执行的代码)编译为本地机器码,提高执行效率。
- 自适应优化: JVM 会根据程序的运行情况, 动态地选择解释执行或 JIT 编译.
- 垃圾回收 (Garbage Collection): JVM 的垃圾回收器负责自动回收不再使用的对象,释放内存。
- 安全管理: JVM 提供了安全机制,例如类加载器的双亲委派模型、字节码校验器等,防止恶意代码的执行。
- 提供运行时环境: JVM 为 Java 程序提供了一个与平台无关的运行时环境.
JVM 架构 (主要组件):
-
类加载器 (ClassLoader): 负责加载类文件。
- 启动类加载器 (Bootstrap ClassLoader): 加载 Java 核心类库(
JAVA_HOME/jre/lib
目录下的 rt.jar 等)。 - 扩展类加载器 (Extension ClassLoader): 加载 Java 扩展类库(
JAVA_HOME/jre/lib/ext
目录下的 jar 包)。 - 应用程序类加载器 (Application ClassLoader): 加载应用程序的类(classpath 下的类)。
- 自定义类加载器: 可以自定义类加载器,实现特殊的类加载逻辑。
- 双亲委派模型: 类加载器在加载类时,会先委托父类加载器加载,只有当父类加载器无法加载时,才由自己加载。
- 启动类加载器 (Bootstrap ClassLoader): 加载 Java 核心类库(
-
运行时数据区 (Runtime Data Areas): JVM 在运行时管理的内存区域。
- 堆 (Heap): 存放对象实例。所有线程共享。
- 方法区 (Method Area): 存放类信息、常量、静态变量、即时编译器编译后的代码等。所有线程共享。
- 运行时常量池 (Runtime Constant Pool): 方法区的一部分,存放编译期生成的各种字面量和符号引用。
- 虚拟机栈 (VM Stack): 存放局部变量、方法参数、返回值、操作数栈、动态链接、方法出口等。每个线程都有自己的虚拟机栈。
- 本地方法栈 (Native Method Stack): 用于支持 native 方法的执行。每个线程都有自己的本地方法栈。
- 程序计数器 (Program Counter Register): 记录当前线程正在执行的字节码指令的地址。每个线程都有自己的程序计数器。
-
执行引擎 (Execution Engine): 负责执行字节码指令。
- 解释器 (Interpreter): 逐条解释执行字节码指令。
- 即时编译器 (JIT Compiler): 将热点代码编译为本地机器码,提高执行效率。
- Client Compiler (C1): 优化速度快,但优化程度较低。
- Server Compiler (C2): 优化速度慢,但优化程度较高。
- 分层编译 (Tiered Compilation): 根据程序的运行情况,选择不同的编译器进行优化。
- 垃圾回收器 (Garbage Collector): 负责自动回收不再使用的对象。
- Serial GC: 单线程垃圾回收器。
- Parallel GC: 多线程垃圾回收器。
- CMS GC (Concurrent Mark Sweep): 并发标记清除垃圾回收器。
- G1 GC (Garbage-First): 一种面向服务端应用的垃圾回收器。
- ZGC: 一种低延迟垃圾回收器.
- Shenandoah: 一种低延迟垃圾回收器.
JVM 的优点:
- 平台无关性 (Write Once, Run Anywhere): Java 字节码可以在任何安装了 JVM 的平台上运行。
- 自动内存管理 (Garbage Collection): 开发者无需手动管理内存,降低了内存泄漏的风险。
- 安全性: JVM 提供了安全机制,防止恶意代码的执行。
- 性能优化 (JIT Compilation): JVM 可以将热点代码编译为本地机器码,提高执行效率。
JVM 的缺点:
- 性能开销: JVM 本身需要占用一定的系统资源。
- 启动时间: JVM 的启动时间可能比较长。
- 复杂性: JVM 的内部结构比较复杂,理解和调优需要一定的专业知识。
JVM、JRE 和 JDK 的关系:
- JDK (Java Development Kit): Java 开发工具包,包含了 JRE 以及开发 Java 程序所需的工具(如编译器 javac、调试器 jdb、javap 等)。
- JRE (Java Runtime Environment): Java 运行环境,包含了 JVM 以及 Java 核心类库。
- JVM (Java Virtual Machine): Java 虚拟机,负责执行 Java 字节码。
+-------------------------------------------------+
| JDK (开发工具) |
| +---------------------------------------------+ |
| | JRE (运行环境) | |
| | +-----------------------------------------+ | |
| | | JVM (虚拟机) | | |
| | +-----------------------------------------+ | |
| | +-----------------------------------------+ | |
| | | Java 核心类库 | | |
| | +-----------------------------------------+ | |
| +---------------------------------------------+ |
| +---------------------------------------------+ |
| | javac, java, javadoc, jar, jdb, ... | |
| +---------------------------------------------+ |
+-------------------------------------------------+
常见的 JVM 实现:
- HotSpot VM: Oracle 官方提供的 JVM,也是目前使用最广泛的 JVM。
- OpenJDK: HotSpot VM 的开源版本。
- GraalVM: Oracle 提供的另一个高性能 JVM,支持多种语言。
- J9 VM: IBM 提供的 JVM。
- Zing VM: Azul Systems 提供的 JVM,专注于低延迟和高吞吐量。
- Microsoft JVM: 微软提供的JVM.
- Amazon Corretto: 亚马逊提供的OpenJDK发行版.
总结:
JVM 是 Java 平台的核心组成部分,它是一个虚拟的计算机,负责加载类文件、管理内存、执行字节码、垃圾回收、安全管理等。JVM 的平台无关性、自动内存管理、安全性和性能优化等特性使得 Java 成为一种流行的编程语言。