JVM(Java Virtual Machine,Java 虚拟机)是运行 Java 应用程序的虚拟机。它是 Java 技术的核心组件之一,提供了一个抽象计算机模型,使 Java 程序可以在任何安装了 JVM 的系统上运行,而无需修改程序本身。JVM 主要职责包括字节码解释、内存管理、垃圾回收、安全性管理和多线程支持等。
1. JVM 的主要功能
字节码解释和执行
- JVM 将编译后的 Java 字节码(.class 文件)解释为机器码并执行,从而实现平台无关性。
内存管理
- JVM 负责管理程序运行时所需的内存,包括分配和释放对象的内存空间。JVM 将内存划分为不同的区域,如堆(Heap)和栈(Stack)。
垃圾回收
- JVM 自动管理内存,通过垃圾回收机制(Garbage Collection, GC)回收不再使用的对象所占用的内存,从而避免内存泄漏。
安全性管理
- JVM 提供了多层次的安全机制,包括类加载器(Class Loader)和安全管理器(Security Manager),保护系统免受恶意代码的攻击。
多线程支持
- JVM 支持多线程编程,允许 Java 程序同时执行多个线程,并提供了丰富的多线程控制机制。
2. JVM 的结构
JVM 的结构可以分为以下几个主要部分:
类加载器子系统(Class Loader Subsystem)
- 负责加载 Java 类文件,将字节码文件转换为 JVM 可以理解的内部数据结构。
运行时数据区(Runtime Data Area)
- JVM 在执行 Java 程序时管理的数据区域,包括:
- 堆(Heap):存放对象实例和数组。
- 方法区(Method Area):存放类信息、常量、静态变量等。
- 虚拟机栈(JVM Stack):存放每个线程的局部变量表、操作数栈等。
- 本地方法栈(Native Method Stack):支持本地方法的调用。
- 程序计数器(Program Counter Register):记录当前线程执行的字节码指令的地址。
执行引擎(Execution Engine)
- 负责执行字节码,包括解释器(Interpreter)和即时编译器(Just-In-Time Compiler, JIT)。
本地方法接口(Native Method Interface, JNI)
- 允许 Java 代码与其他语言(如 C、C++)编写的本地代码进行交互。
垃圾回收器(Garbage Collector, GC)
- 负责自动管理内存,回收不再使用的对象。
3. JVM 工作原理
类加载
- 通过类加载器将 .class 文件加载到内存中,形成类的元数据。
字节码验证
- JVM 对加载的字节码进行验证,确保其格式和语义是合法的。
字节码执行
- 通过解释器逐条解释执行字节码指令,或通过 JIT 编译器将热点代码编译为本地机器码执行,提高性能。
内存管理
- JVM 在执行过程中动态分配和回收内存,通过垃圾回收机制确保内存使用的高效性。
异常处理
- JVM 提供了异常处理机制,在程序运行时捕获和处理异常情况,确保程序的健壮性。
4. JVM 与 JRE 和 JDK 的关系
- JVM(Java Virtual Machine):是执行 Java 字节码的虚拟机,负责解释和执行 Java 程序。
- JRE(Java Runtime Environment):包含 JVM 以及 Java 类库和其他支持文件,是运行 Java 应用程序的环境。
- JDK(Java Development Kit):包含 JRE 和开发工具(如编译器
javac
、调试器jdb
),是开发 Java 程序的完整工具包。
5. 常见的 JVM 实现和它们的特点
JVM 实现 | 特点和适用场景 | 厂商/组织 |
---|---|---|
Oracle HotSpot | 高性能、稳定性好,成熟的垃圾回收器和即时编译器,适用于生产环境和大规模部署。 | Oracle |
OpenJ9 | 内存效率高、启动速度快,优秀的垃圾回收和即时编译技术,适合云环境和节省资源的应用。 | Eclipse Foundation / IBM |
Zing | 预测性能优秀,专为高并发和大规模应用设计,具有高效的垃圾回收和支持大规模并发的特性。 | Azul Systems |
GraalVM | 支持多语言混合编程,包括 Java、JavaScript、Python 等,集成了高性能的 Graal 即时编译器。 | Oracle |
Amazon Corretto | 免费、长期支持的 OpenJDK 发行版,亚马逊优化,保证了兼容性和安全增强。 | Amazon |
6. HotSpot 虚拟机的发展历程可以概括如下:
阶段 | 时间 | 主要特点和里程碑 |
---|---|---|
初出茅庐 | 1999年4月 | 初次在 JDK 中使用,源自于收购的 SmallTalk 虚拟机技术。 |
野蛮生长 | 2006年12月 | JDK 6 发布,进行了大量虚拟机层面的优化,为后续发展奠定了基础。 |
稳步前进 | 2009-2013年 | JDK 7 引入 G1 垃圾收集器,吸纳了 JRockit 虚拟机的设计思想,JDK 8 去除永久代并引入 JMC 工具。 |
百家争鸣 | 2018-2019年 | JDK 11 优化了 G1 垃圾收集器性能,推出 ZGC 和 Shenandoah 新一代垃圾回收器。 |
拥抱云原生 | 2019年至今 | GraalVM 虚拟机基于 HotSpot 发展,解决多语言整合问题,提升运行时效率,适用于云原生架构。 |