JVM 加载器
- 根加载器 c++ rootstrap
- 系统类加载器,应用类加载器 Java
- 扩展类加载器 Java
- 用户自定义加载器
每一个类都有一个加载它的类加载器的引用,使用getClassLoader可以获得加载器的类型,如果为null,则使用的类加载器为根加载器
类加载方式
- 从class文件加载
- 从网络中加载
- 从jar等压缩包中加载
- Java文件动态编译加载
类加载的步骤
- 加载:class文件中存储的类信息变为运行时数据结构加载到方法区中,并在堆中创建一个实例作为方法区中的入口。
- 验证:验证class文件流存储格式,文件格式,代码是否符合Java语言规范,数据流和控制流是否对JVM有危害,文件是否可以被当前版本JVM解析
- 准备:在方法区分配内存,类变量和静态变量在这里初始化,
- 解析:间接引用转直接引用
- 类的初始化:调用
cinit方法初始化
类加载器加载类的过程
- 判断此类是否已经加载,如果已经加载则直接返回此类。
- 判断此类的父类加载器是否存在,如果存在则使用父类加载器加载此类。
- 从根加载器中搜索此类,如果此类存在,则加载此类
- 从文件目录中搜索此类的class文件,如果此类存在,则加载此类
- 否则抛出异常