JVM类加载机制
JVM 类加载(Class Loading)是指将 .class 字节码加载到内存,并转换为 JVM 可执行结构的全过程。其核心目标是:
- 按需加载(Lazy Loading)
- 保证类型安全(Type Safety)
- 支持动态扩展(如反射、热部署)


1.Compile 阶段(编译期)
1.1 输入
HelloWorld.java(源码)
1.2 编译器(Javac)
核心职责:
| 能力 | 说明 |
|---|---|
| 语法分析 | AST构建 |
| 语义分析 | 类型检查、符号表 |
| 编译检查(图中红字) | 编译期错误拦截 |
| 字节码生成 | 输出 .class |
1.3 输出
HelloWorld.class(JVM字节码)- 平台无关(Write once, run anywhere)
2.Class Loader(类加载器)
2.1 作用
- 将
.class文件加载进 JVM 内存(方法区/元空间)
说明 class 可以来自:
- 本地文件系统
- 网络(远程加载)
- 自定义 ClassLoader(典型:插件系统)
2.1 类加载流程
flowchart TD
A[加载 Loading] --> B[验证 Verification]
B --> C[准备 Preparation]
C --> D[解析 Resolution]
D --> E[初始化 Initialization]
3.Byte Code Verifier(字节码校验器)
| 类型 | 示例 |
|---|---|
| 文件格式 | 魔数 CAFEBABE |
| 元数据 | 类结构合法性 |
| 字节码语义 | 操作数栈正确 |
| 符号引用 | 方法/字段存在 |
- 防止恶意代码破坏 JVM
- 保证不会非法访问内存(区别 C/C++)
👉 JVM 能安全运行远程代码,靠的就是这里
4.Interpreter(解释器) + JIT
4.1 两种执行模式
| 模式 | 说明 |
|---|---|
| Interpreter | 一行一行解释执行 |
| JIT Compiler | 热点代码编译成本地机器码 |
4.2 执行优化路径
flowchart LR
A[字节码] --> B[解释执行]
B --> C{热点代码?}
C -->|是| D[JIT编译]
D --> E[本地机器码]
C -->|否| B
5.Runtime(运行时环境)
5.1 JVM Runtime 包含
- 堆(Heap)
- 栈(Stack)
- 方法区(Metaspace)
- GC(垃圾回收)
- 线程调度
5.2 本质
👉 JVM = 一个用户态虚拟操作系统
6.Hardware(硬件层)
最终:
- CPU 执行机器码
- 内存参与数据存储
7.关键设计思想总结
7.1 编译期 vs 运行期分离
| 阶段 | 目的 |
|---|---|
| 编译期 | 提前发现错误 |
| 运行期 | 动态加载 + 执行 |
7.2 安全模型(三层保障)
- 编译检查(语法)
- 字节码校验(安全)
- ClassLoader 隔离(沙箱)
7.3 动态能力(区别 C/C++)
- 运行时加载类
- 反射
- 动态代理
- 热部署(如 Tomcat)