Java虚拟机之类加载(双亲委派模型)

本文介绍了Java中的类加载器概念及其工作原理,包括Bootstrap、Extension和Application三种类型的类加载器。详细解释了类加载器如何确保类的唯一性,并探讨了双亲委派模型的工作流程及其优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类加载器

完成”通过一个全限定名来获取描述此类的二进制字节流“动作的代码模块叫做类加载器。

对于同一个类,需要由类加载器和这个类本身一桶确立其在Java虚拟机中的唯一性。每一个类加载器都有一个独立的类名称命名空间。换句话说,比较两个类是否相等,必须在这两个类是同一个类加载器加载的前提下,进行比较才有意义。否则,即使这两个类来自同一个class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类也必定不相等。


Bootstrap ClassLoader 启动类加载器

这个类加载器由C++实现,是虚拟机的一部分。其他的类加载器都是用Java语言实现,独立于虚拟机的外部,都继承抽象类java.lang.ClassLoader。这个类加载器负责将JAVA_HOME/lib( 或者通被-Xbootclasspath参数所指定的路径)下的能被虚拟机识别的类库加载到内存里。虚拟机死按照文件名来识别类库的,名字不符合的类库,即使放在lib目录下也不会被加载。


Extension ClassLoader扩展类加载器

它负责加载JAVA_HOME/Ext/lib目录下的类库。 或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。

Application ClassLoader应用程序类加载器


这个类加载器是ClassLoader中 getSystemClassLoader中的返回值。负责加载用户类路径ClassPath上所指定的文件。


这里需要注意的是上述三个JDK提供的类加载器虽然是父子类加载器关系,但是没有使用继承,而是使用了组合关系。

从JDK1.2开始,java虚拟机规范推荐开发者使用双亲委派模式(ParentsDelegation Model)进行类加载,其加载过程如下:

(1).如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器去完成。

(2).每一层的类加载器都把类加载请求委派给父类加载器,直到所有的类加载请求都应该传递给顶层的启动类加载器。

(3).如果顶层的启动类加载器无法完成加载请求,子类加载器尝试去加载,如果连最初发起类加载请求的类加载器也无法完成加载请求时,将会抛出ClassNotFoundException,而不再调用其子类加载器去进行类加载。

双亲委派 模式的类加载机制的优点是java类它的类加载器一起具备了一种带优先级的层次关系,越是基础的类,越是被上层的类加载器进行加载,保证了java程序的稳定运行。双亲委派模式的实现:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值