Follow me on GitHub

类加载(一):简介

Java 源代码被 Javac 编译为存储在 class 文件中的字节码,class 文件需要被加载到 JVM 虚拟机中才能被使用,类加载机制是指虚拟机把 字节码 转换为虚拟机能直接使用的 Java 类型 的过程,粗略包括:

  1. 加载:将字节码从 class 文件 加载到 内存
  2. 连接:验证、准备、解析字节码;
  3. 初始化类型;

动态加载

与 C 语言在 编译期 执行加载、连接不同,Java 的加载、连接、初始化在 运行期 完成:

  • 缺点:运行期有类加载的 开销,多少影响运行性能;
  • 优点:语言高度灵活,可动态扩展
    • SPI 机制:面向接口编程,实际运行时可以随时 替换 具体的实现类,比如可以随时修改线上 Dubbo 程序的序列化实现;
    • AOP:运行时动态 注入字节码,动态加载修改后的字节码,实现 动态代理

类的生命周期

类从被加载到 JVM 内存,到卸载出 JVM 内存,其生命周期包括:

  1. 加载
  2. 连接(验证、准备、解析)
  3. 初始化
  4. 使用
  5. 卸载

类生命周期

类加载

类加载机制包括前 3 步:

  1. 加载
  2. 连接:验证、准备、解析
  3. 初始化

其中加载、验证、准备、初始化 4 步的 启动顺序 固定,必须按照该顺序开始,开始后可 交叉执行,且结束顺序无规定。

解析 比较特殊,它是将 符号引用 替换为 实际引用 的过程,可以在 初始化 之前 or 之后启动。

初始化阶段过后,类就可以被正常使用,在它之后执行 解析 是为了支持 动态绑定,即实际运行时才解析使用的 符号引用