当前位置: 首页 > 后端技术 > Java

【JVM知识汇总-10】类加载器

时间:2023-04-01 16:32:14 Java

【JVM知识汇总-1】JVM内存模型【JVM知识汇总-2】HotSpot虚拟机对象【JVM知识汇总-3】垃圾回收策略与算法【JVM知识汇总-4]HotSpot垃圾收集器【JVM知识汇总-5】内存分配与回收策略【JVM知识汇总-6】JVM性能调优【JVM知识汇总-7】类文件结构【JVM知识汇总-8】类加载时机【JVM知识总结-9】类加载过程【JVM知识总结-10】类加载器类和类加载器判断类是否“相等”任何类加载它的类加载器和类本身共同建立其在Java虚拟机中的唯一性,每个类加载器都有一个独立的类命名空间。因此,比较两个类是否“相等”只有在两个类被同一个类加载器加载时才有意义,否则,即使两个类来自同一个Class文件,也是由同一个虚拟机加载加载的,如只要加载它们的类加载器不同,那么这两个类就一定是不相等的。这里的“相等”包括代表类对象的equals()方法,isInstance()方法的返回结果,以及使用instanceof关键字来判断对象的关系。加载器类型系统提供了3种类型的类加载器:BootstrapClassLoader:负责存放在\lib目录下,并被虚拟机识别(仅通过文件名识别,如rt.jar,类库的类库name不匹配即使放在lib目录下也不会加载)类库加载到虚拟机内存中。ExtensionClassLoader:负责加载\lib\ext目录下的所有类库,开发者可以直接使用扩展类加载器。应用类加载器(ApplicationClassLoader):由于该类加载器是ClassLoader中getSystemClassLoader()方法的返回值,所以一般称为“系统类加载器”。它负责加载用户类路径(classpath)上指定的类库。开发者可以直接使用这个类加载器。如果应用程序没有自定义自己的类加载器,一般这是程序中的默认类。装载机。当然,如果有必要,您仍然可以添加自己定义的类加载器。什么是双亲委派模式?双亲委派模型描述了类加载器之间的层次关系。它要求除顶层启动类加载器外,其余类加载器必须有自己的父类加载器。(父子关系一般采用继承的方式实现,但父加载器的代码以组合关系复用。)在工作过程中,类加载器如果收到类加载请求,不会尝试先自己加载类,但是是把这个请求委托给父类加载器来完成,每一级类加载器都是这样,所以所有的加载请求都应该发送给最顶层的启动类加载器,只当父类加载器反馈无法完成该类加载请求时(例如:找不到需要的类),子加载器会尝试自行加载。在java.lang.ClassLoader中的loadClass方法中实现该过程。为什么要使用双亲委派机制?rt.jar中存储的类,如java.lang.Object,无论使用哪个类加载器加载,最终都会委托给最上层的启动类加载器去加载,这样不同的加载器加载的Object类都是一样的。反之,如果不使用双亲委派机制模型,每个类加载器自己加载,如果用户写了一个名为java.lang的类。对象类,无法保证Java类型系统中最基本的行为。