JVM 类加载原理

48 阅读1分钟

JVM 加载器

  1. 根加载器 c++ rootstrap
  2. 系统类加载器,应用类加载器 Java
  3. 扩展类加载器 Java
  4. 用户自定义加载器

每一个类都有一个加载它的类加载器的引用,使用getClassLoader可以获得加载器的类型,如果为null,则使用的类加载器为根加载器

类加载方式

  1. 从class文件加载
  2. 从网络中加载
  3. 从jar等压缩包中加载
  4. Java文件动态编译加载

类加载的步骤

  1. 加载:class文件中存储的类信息变为运行时数据结构加载到方法区中,并在堆中创建一个实例作为方法区中的入口。
  2. 验证:验证class文件流存储格式,文件格式,代码是否符合Java语言规范,数据流和控制流是否对JVM有危害,文件是否可以被当前版本JVM解析
  3. 准备:在方法区分配内存,类变量和静态变量在这里初始化,
  4. 解析:间接引用转直接引用
  5. 类的初始化:调用cinit方法初始化

类加载器加载类的过程

  1. 判断此类是否已经加载,如果已经加载则直接返回此类。
  2. 判断此类的父类加载器是否存在,如果存在则使用父类加载器加载此类。
  3. 从根加载器中搜索此类,如果此类存在,则加载此类
  4. 从文件目录中搜索此类的class文件,如果此类存在,则加载此类
  5. 否则抛出异常