请描述 JVM 的各个组成模块,并说明每个模块在 Java 程序运行中承担的基本职责。
考察说明
考查对 JVM 整体架构和核心组件功能的理解。
回答思路
- 【回答框架 1】JVM 主要由类加载子系统、运行时数据区、执行引擎以及本地方法接口等部分组成。类加载子系统负责加载、链接和初始化 Java 类,将字节码装载到运行时数据区。
- 【回答框架 2】运行时数据区包括程序计数器、虚拟机栈、本地方法栈、方法区和堆。其中堆和方法区由所有线程共享,此外它们也是垃圾收集的主要区域;程序计数器和两个栈为线程私有,分别记录字节码执行位置、Java 方法调用帧和本地方法调用状态。
- 【回答框架 3】执行引擎负责解释或编译字节码为机器指令并执行,包含解释器、即时编译器(如 C1/C2)和垃圾收集器,即时编译器用于热点代码优化,垃圾收集器管理堆中对象的分配和回收。
- 【回答框架 4】本地方法接口用于调用非 Java 语言实现的方法,如通过 JNI 构建的本地库,实现与操作系统或 C/C++ 代码的互操作。
- 【回答框架 5】各组件协同运行:类加载子系统将类字节码加载到方法区,执行引擎调度线程栈中的栈帧,并在堆上创建对象,同时由垃圾收集器回收不再使用的对象,而程序计数器在栈帧之间切换时保存当前执行位置。
- 【关键点 1】JVM 包含类加载子系统、运行时数据区、执行引擎和本地方法接口。
- 【关键点 2】运行时数据区中堆和方法区为线程共享,虚拟机栈、本地方法栈和程序计数器为线程私有。
- 【关键点 3】执行引擎包括解释器、即时编译器和垃圾收集器。
- 【关键点 4】类加载过程分为加载、链接和初始化三个阶段。
- 【易错点 1】不能认为方法区在 JDK8 中仍然是永久代实现,实际上已被元空间替代。
- 【易错点 2】不能将本地方法接口与本地方法栈混淆,前者是调用接口,后者是执行时使用的内存区域。
- 【易错点 3】程序计数器在线程执行本地方法时值为空,而不是始终存有字节码地址。