JVM类加载机制

JVM 类加载(Class Loading)是指将 .class 字节码加载到内存,并转换为 JVM 可执行结构的全过程。其核心目标是:

  • 按需加载(Lazy Loading)
  • 保证类型安全(Type Safety)
  • 支持动态扩展(如反射、热部署)

32e880d042f17b6008b76a20f71eb50c.png

12d9a145744ea2bda4f88279b00cf5ce.png


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 安全模型(三层保障)

  1. 编译检查(语法)
  2. 字节码校验(安全)
  3. ClassLoader 隔离(沙箱)

7.3 动态能力(区别 C/C++)

  • 运行时加载类
  • 反射
  • 动态代理
  • 热部署(如 Tomcat)