01初识 JVM
1.什么是JVM
JVM 全称是 Java Virtual Machine,中文译名 Java 虚拟机。它本质上是一个运行在计算机上的程序,其职责是运行 Java 字节码文件。
我们编写的 HelloWorld.java 源代码文件,通过 javac 命令编译后会生成 HelloWorld.class 字节码文件,再使用 java 命令启动 JVM 来解释运行这份字节码。JVM 会将字节码指令实时解释成计算机能够执行的机器码,最终交给计算机执行。

2.JVM功能
JVM 的核心功能可以归纳为以下三个方面:

-
解释和运行:对字节码文件中的指令,实时解释成机器码,让计算机执行。Java 之所以在不做优化时性能不如 C、C++,正是因为 C、C++ 编译后会直接生成可执行的机器码指令,而 Java 生成的是字节码文件,需要再由 JVM 实时解释成机器码。但这种设计也带来了跨平台的优势——同一份字节码可以在 Windows、Linux 等不同平台上被解释成对应的机器码运行,这是 Java 为了支持跨平台特性而做出的取舍。
-
内存管理:自动为对象、方法等分配内存,并通过自动的垃圾回收机制回收不再使用的对象,开发者无需手动管理内存。
-
即时编译(JIT):对热点代码进行优化,提升执行效率。由于 JVM 需要实时解释虚拟机指令,不做任何优化时性能不如直接运行机器码的 C、C++ 等语言。JVM 提供了即时编译(Just-In-Time,简称 JIT)机制,会将热点代码的字节码指令编译优化成汇编和机器码并保存至内存,下次再执行时直接调用,从而大幅提升性能。经过 JIT 优化后,Java 的运行性能可以接近 C、C++,甚至在特定场景下实现超越。

3.常见的JVM
常见的 JVM 实现包括 HotSpot、GraalVM、Eclipse OpenJ9 等,另外阿里巴巴的 Dragonwell JDK(龙井)也提供了一款功能增强版的 JVM。其中使用最广泛的是 HotSpot 虚拟机,它既是 Oracle JDK 的默认虚拟机,也是 OpenJDK 的默认虚拟机,稳定可靠、社区活跃;GraalVM 支持多语言混合编程,适合微服务、云原生架构;Dragonwell 在电商、物流、金融等对性能要求较高的领域应用较多。

这些 JVM 实现都遵守《Java 虚拟机规范》。该规范由 Oracle 制定,主要包含了 Java 虚拟机在设计和实现时需要遵守的规范,涵盖 class 字节码文件的定义、类和接口的加载和初始化、指令集等内容。
需要特别注意的是,《Java 虚拟机规范》是对虚拟机设计的要求,而不是对 Java 语言设计的要求。也就是说,虚拟机可以运行其他语言(如 Groovy、Scala)生成的 class 字节码文件之上。规范官网地址:Java SE 规范
4.JVM组成
JVM 主要分为四个部分:
- 类加载器(ClassLoader):加载 class 字节码文件中的内容到内存中。
- 运行时数据区域(即 JVM 管理的内存):负责管理 JVM 使用到的内存,比如创建对象和销毁对象。
- 执行引擎(即时编译器、解释器、垃圾回收器等):将字节码文件中的指令解释成机器码,同时使用即时编译器优化性能。
- 本地接口:调用本地已经编译的方法,比如虚拟机中提供的 C/C++ 的方法。
