JVM(Java 虚拟机)是 Java 程序的运行环境,它负责将 Java 字节码(.class 文件)转换为特定平台的机器码,并执行这些机器码。以下是 JVM 的主要组成部分和功能:
-
类加载器(ClassLoader):负责加载类文件,并将类加载到 JVM 中。类加载器通常按照一定的委托模型进行工作,可以自定义类加载器来实现特定的类加载需求,比如从网络或其他来源动态加载类。
-
运行时数据区域:JVM 将内存划分为不同的数据区域,包括堆、栈、方法区(在 Java 8 之前称为永久代,Java 8 开始称为元空间)、程序计数器等。
- 堆(Heap):用于存储对象实例和数组,是 Java 程序中动态分配的主要内存区域。
- 栈(Stack):存放线程私有的方法栈、本地方法栈和操作数栈,每个线程都有自己的栈,用于方法调用和局部变量存储。
- 方法区(Method Area):用于存储类的结构信息、运行时常量池、静态变量、即时编译器编译后的代码等。
- 程序计数器(Program Counter):记录线程执行的当前字节码指令地址。
-
执行引擎(Execution Engine):负责解释或执行字节码指令。通常有两种方式来实现执行引擎:解释执行和即时编译(JIT Compilation)。解释执行将字节码逐条解释为机器码执行,而即时编译将字节码编译成本地机器码,以提高执行速度。
-
本地方法接口(Native Interface):允许 Java 应用程序调用本地(非 Java)方法,通过 JNI(Java Native Interface)来实现 Java 与本地代码之间的交互。
-
本地方法库(Native Method Library):包含了 JVM 调用的本地方法的实现。
-
垃圾回收器(Garbage Collector):负责在运行时自动管理堆内存的分配和释放,以及检测和回收不再使用的对象,防止内存泄漏。
-
安全子系统:负责实施 Java 的安全策略,并提供安全管理机制,包括安全管理器、安全策略文件等。
JVM 的跨平台性和垃圾回收机制是 Java 语言的两个重要特性之一,它使得 Java 程序可以在不同的操作系统和硬件平台上运行,并且可以有效地管理内存,减少了程序员处理内存管理的负担。