JVM 类装载原理分析-类装载过程

  应用可对Class对象进行实例化,从而进行调用,JVM类加载机制是动态的,因此可在运行时动态加载外部类、远程网络下载的字节码等。
  
  JVM类加载过程分为三个步骤:装载、链接、初始化,其中初始化不是必须的,装载和链接过程后即可完成将二进制字节码转为Class对象,初始化时将Class对象实例化,从而得到Object的过程。类的加载过程及生命周期如下图:
JVM 类装载原理分析-类装载过程

  • 1. 装载
      JVM的类装载通过ClassLoader完成,加载过程通过三个元素来唯一标识一个被加载的类:类名、包名、ClassLoader实例ID。JVM对于接口或非数组型的类、数组型类加载有区别

    • 接口或非数组型类:这种类型的类由所在的ClassLoader负责加载
    • 数组型类:数组型类中的元素由所在的ClassLoader负责加载,数组类由JVM直接创建
  • 2. 链接
      JVM链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用的接口、类。
      1. 二进制字节码的校验遵循Java Class File Format规范,如果不符合规范,则抛出VerifyError错误,校验过程如果碰到其他接口、类也会进行加载,加载失败则会抛出NoClassDefFoundError错误。
      2. 完成校验后,JVM初始化类中的静态变量,并将其值赋为默认值
      3. 最后对类中的属性、方法进行验证,以确保其需要调用的属性、方法存在,以及具备相应的权限(public、private域权限等),这个阶段失败可能会造成NoSuchMethodError、NoSuchFiledError等错误。

  • 3. 初始化
      初始化过程即为执行类中静态初始化代码、构造器代码的初始化,一下情况会出发执行:

    • new 对象
    • 反射调用类中的方法
    • 子类调用初始化
    • JVM启动过程中指定的初始化类