1.ClassLoader
目的:提前加载.class类文件到内存中。
类加载器是一个运行时核心基础设施模块。
类加载的过程
1)加载 JVM把class文件加载到内存,并将静态数据转换成方法区中的运行时数据结构,在堆中生成代表这类的java.lang.Class对象,类加载器的由低到高层次结构有:
用户自定义的类加载器、Application ClassLoader 加载CLASSPATH路径下的类、Platform ClassLoader 加载一些扩展的系统类、Bootstrap ClassLoader 加载Java的核心类库
2)链接 将java的二进制代码合并到jvm运行状态
验证 确保符合Class对象jvm规范进行更详细的校验
准备 为类变量(static变量)在方法区分配内存并设置类变量初始值的阶段
解析 虚拟机常量池内的符号引用替换为直接引用的过程
3)初始化 初始化阶段是执行类构造器方法的过程
2.双亲委派机制
会优先询问且使用父类加载器进行加载类,可以使用自定义的类加载器加载类。
询问的顺序:Application ClassLoader【CLASSPATH】 -> Platform ClassLoader(Extension ClassLoader)【jre/lib/ext/*.jar等】 ->Bootstrap ClassLoader【jre/lib/rt.jar等】
类加载器具有等级制度,但是并非继承关系。
使用不同的类加载器加载类会有一个不同的命名空间进行区分,JVM中除了同一个类加载器实例还有加载的是全名相等的类时才确定是加载同一个类。
参考的资料:《码》P117、P121