类加载

类加载过程

虚拟机将 .class 加载入内存,运行时进行

  • 加载
    • 读取.class数据,转化成 方法区的数据结构
    • 生成一个 java.lang.Class对象 ,作为该数据的访问入口
  • 验证
    • 文件格式验证:验证字节流是否符合Class文件格式的规范。
    • 元数据验证:要符合Java语言规范
    • 字节码验证:类的方法体 的校验分析
    • 符号引用验证:发生在解析阶段
  • 准备 静态变量赋值
    • static 变量 内存分配
    • static 变量 设置初始值
      • 初始值是 变量数据类型的默认值
      • final 修饰成常量时 初始值为 被赋予的值
  • 解析
    • 符号引用转换为直接引用
      • 符号引用:编译期间的内存具体位置的占位符
      • 直接引用:直接或间接指向目标内存位置
      • 引用的类型未加载初始化:触发这个引用对应类型的加载和初始化
  • 初始化 主动资源初始化
    • static变量 会赋予实际代码赋予的值
    • static代码块 会执行里面的代码

方法区中,使用同一加载器的情况下,每个类只会有一份Class字节流信息
Java堆中,使用同一加载器的情况下,每个类只会有一份 java.lang.Class 类的对象

类加载器

启动类加载器(Bootstrap Class Loader)

拓展类加载器(Extension Class Loader)

应用程序类加载器(Application Class Loader)