Reborn's Blog

JVM笔记2 -- 类加载机制

2018-11-10·Java, JVM, ClassLoader

类加载过程

加载 → 验证 → 准备 → 解析 → 初始化 → 使用 → 卸载

加载

  1. 通过全限定名获取二进制字节流
  2. 将静态存储结构转化为方法区运行时数据结构
  3. 在堆中生成 Class 对象作为访问入口

验证

确保类的正确性:文件格式验证 → 元数据验证 → 字节码验证 → 符号引用验证

准备

为静态变量分配内存并初始化为默认值。但 final static 变量在准备阶段就被初始化为指定值。

解析

将符号引用转换为直接引用。符号引用包括:类/接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符。

初始化

为静态变量赋予正确的初始值。两种方式:

  1. 声明时指定初始值
  2. 静态代码块

初始化时机(主动使用才会触发):

  • new 创建实例
  • 访问或赋值静态变量
  • 调用静态方法
  • 反射(Class.forName)
  • 初始化子类时父类先初始化
  • 虚拟机启动时的主类

双亲委派机制

Bootstrap ClassLoader
    ↑
Extension/Platform ClassLoader
    ↑
Application ClassLoader
    ↑
Custom ClassLoader

加载时先委托给父加载器,父加载器无法加载时才自己加载。防止核心类被篡改。

结束生命周期

  • 执行 System.exit()
  • 程序正常结束
  • 遇到异常或错误终止
  • 操作系统错误导致 JVM 进程终止
#Java#JVM#ClassLoader