类加载过程

类的生命周期说一下

加载、连接(验证,准备,解析)、初始化、使用、卸载

类的加载过程具体说一下

类的加载包括了加载、连接(验证,准备,解析)、初始化

  1. 加载
  • 通过全类名获取定义此类的二进制字节流
  • 将字节流所代表的静态存储结构转换为运行时数据区的结构
  • 在内存中生成一个代表该类的Class对象,作为方法区这些数据的访问入口
  1. 验证
  • 文件格式验证
  • 元数据验证
  • 字节码验证
  • 符号引用验证
  1. 准备
  • 为类变量(static)分配内存并设置类变量初始值
  • 准备阶段初始化为0值,等到初始化阶段才会赋值。==但是有特殊情况,如果是final static的变量,那么准备阶段就会被赋值了==
  1. 解析
  • 将常量池内的符号引用替换为直接引用的过程
  • 符号引用就是一组符号来描述目标,可以是任何字面量。直接引用就是直接指向目标的指针。
  1. 初始化
  • 调用<clint>方法,就是执行静态代码块
  • 只有以下6中情况会发生初始化
    • 遇到new、getstatic、putstatic、invokestatic
    • 反射,比如class.forName(…),newInstance等
    • 初始化一个类,其父类还没初始化,先让其父类初始化
    • 包含main方法的主类,会先初始化
    • MethodHandle和VarHandle可以看作是轻量级的反射,要用这两个,需要先使用findStaticVarHandle来初始化要调用的类
    • 当一个接口定义了JDK8中新的default接口方法时,如果实现类发生了初始化,那该接口要在其之前被初始化

卸载发生的条件

  • 该类的所有的实例对象都被GC了,堆中不存在该类的任何对象
  • 该类没有在其他地方被引用
  • 该类的类加载器的实例已被GC

卸载是什么意思

该类的class对象被GC