类加载过程包括加载(load)、链接(linking)和初始化(init)

  • 加载
    将字节码文件从数据源中加载到JVM内存中,生成JVM的认可的数据结构(也就是Class对象),数据源可以是来自物理硬盘或者网络的jar文件、war文件、class文件等一些JVM可识别的文件格式结构(文件格式异常回报ClassFormatError)。
  • 链接
    链接是类加载的核心部分,分三个步骤:验证、准备和解析
    1.验证(Verify):保证字节流信息符合JVM规范,避免恶意数据危害JVM的安全运行(异常抛出VerifyError)。
    2.准备(Prepare):为类变量分配内存和为变量设置初始值。
    3.解析(Resolve):将符号应用转换为直接应用,符号应用就是一组符号来描述所应用的目标,直接应用就是直接指向目标的指针或句柄。
  • 初始化
    初始化主要是将静态变量赋值和执行静态代码块的一系列操作。

双亲委派机制

双亲委派机制是在类加载过程中加载部分里的机制,加载器大致有启动类加载器Bootstrap ClassLoader(加载核心的类)、扩展类加载器Extension ClassLoader(ext path下的类)和应用类加载器Application ClassLoader(自定义)。
在执行类加载请求时,子加载器会先委托父类加载器执行;如果父类加载器还存在父类加载器就继续委托,一次递归找到其顶部启动类加载器;如果启动类加载器可以完成任务则将结果返回,倘若启动类加载器不能完成任务这时一次再让子类加载器尝试加载,这个过程叫双亲委派机制。

双亲委派机制优点

1.避免类重复加载
2.保护程序安全,防止核心API被篡改(java.lang.String)