📌 PDF :大白话说Java面试题 --- 02-JVM篇
第1题:JVM由哪些部分组成?
📚 回答:
- 核心组成 :
JVM(Java虚拟机)主要由三大部分组成:类装载子系统 、运行时数据区 和字节码执行引擎 。它们各司其职,共同协作完成Java程序的加载、存储和执行。

1. 类装载子系统
-
功能:
- 负责将
.class文件加载到JVM中,并进行验证、准备、解析和初始化。 - 主要包括以下步骤:
- 加载:通过类加载器(如启动类加载器、扩展类加载器、应用程序类加载器)将字节码文件加载到内存。
- 链接:分为验证、准备和解析三个阶段,确保类的正确性和完整性。
- 初始化:为静态变量赋值并执行静态代码块。
- 负责将
-
类加载器机制:
- 双亲委派模型:类加载器优先委托父类加载器加载类,只有当父类加载器无法加载时,才会尝试自己加载。
💡 代码示例 :
以下代码展示了类加载的过程:
java
public class ClassLoaderDemo {
public static void main(String[] args) {
System.out.println("Class loaded by: " + ClassLoaderDemo.class.getClassLoader());
}
}
2. 运行时数据区
- 定义 :
- 运行时数据区是JVM的内存模型,负责存储Java程序运行过程中所需的各种数据。
- 包括以下五个部分:
- 堆:线程共享,用于存放对象实例和数组。
- 元空间:线程共享,用于存储类元信息、常量池、静态变量等。
- 虚拟机栈:线程私有,用于存储方法调用过程中的局部变量表、操作数栈等。
- 本地方法栈:线程私有,用于支持本地方法(Native Method)的调用。
- 程序计数器:线程私有,用于记录当前线程执行的字节码指令地址。
3. 字节码执行引擎
- 功能 :
-
负责解释或编译执行运行时数据区中的字节码指令。
-
支持两种执行方式:
- 解释执行:逐条解释字节码指令并执行。
- 即时编译(JIT):将热点代码编译为机器码以提高执行效率。
💡 面试官视角:
-
- 面试官可能会问"类加载器的双亲委派模型有什么作用?"
答:避免类的重复加载,保证核心类库的安全性(如防止自定义类覆盖java.lang.String)。 - 面试官可能会追问"JIT编译器的作用是什么?"
答:将频繁执行的代码编译为机器码,提升程序运行效率。