jvm-双亲委派机制

Java类加载器主要分为以下几种:

  1. 引导类加载器(Bootstrap ClassLoader):也称为启动类加载器,负责加载JVM的核心类库,如java.lang.*包中的类。这些类在JVM启动时就已经被加载到内存中,因此引导类加载器是最早开始工作的类加载器。

  2. 扩展类加载器(Extension ClassLoader):负责加载JVM的扩展类库,如javax.*、com.sun.*等包中的类。这些类通常由第三方开发者提供,并通过编译后生成的jar文件来实现类加载。

  3. 应用程序类加载器(Application ClassLoader):负责加载应用程序代码中的类。应用程序类加载器是最常用的类加载器,它从classpath下查找和加载类文件。

  4. 自定义类加载器(Custom ClassLoader):用户可以创建自定义的类加载器来满足特定的需求,如支持某种特定类型的资源加载,或者实现AOP(面向切面编程)等。自定义类加载器可以通过继承ClassLoader类并重写findClass()方法来实现。

双亲委派机制描述

某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,(每个ClassLoader实例都有一个父类加载器的引用【不是继承的关系,是一个包含的关系】)依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。如果都加载失败了,就会抛出ClassNotFoundException异常,下面是加载过程:

java类加载为什么采用双亲委派模型

如类java.lang.Object,它存放在rt.jar中,无论哪个类加载器要加载这个类,最终都会委派给启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。相反,如果用户自己写了一个名为java.lang.Object的类,并放在程序的Classpath中,那系统中将会出现多个不同的Object类,java类型体系中最基础的行为也无法保证,应用程序也会变得一片混乱,使用双签委派机制可以保证我们的程序不会出现混乱的情况。

双亲委托机制优点缺点:

优点:

  1. 安全性:双亲委派模型可以防止潜在的安全问题,因为只有具备足够权限的类加载器才能加载类。如果一个类加载器在加载类时出现错误,它的父类加载器会继续尝试加载这个类,直到找到合适的类加载器或所有父类加载器都失败为止。这样可以避免潜在的安全漏洞。

  2. 可靠性:双亲委派模型保证了类的一致性,因为所有的类都是由同一个类加载器加载的。这意味着无论在哪个类路径下查找类,只要遵循双亲委派模型,最终都会由同一个类加载器来加载。这种一致性有助于减少因不同类加载器之间的不一致导致的异常和错误。

  3. 灵活性:双亲委派模型允许用户自定义类加载器,以满足特定的需求。例如,可以使用不同的类加载器来加载不同类型的资源(如配置文件、XML文件等),或者实现AOP(面向切面编程)等高级功能。

缺点:

  1. 开销较大:由于双亲委派模型需要将任务委托给父类加载器,因此在每个加载请求中都需要进行一次委托操作。这种委托操作可能会增加一定的开销。当使用多个不同的类加载器时,这种开销可能会更加明显。

  2. 不适用于所有情况:双亲委派模型并不适用于所有情况。例如,在某些特殊场景下,可能需要在运行时动态地创建类加载器。此外,对于一些小型应用程序,使用单例类加载器可能是更好的选择。

注意

并不是所有的类加载器都采用双亲委托机制。Java虚拟机规范并没有明确要求,类加载器的加载机制一定要使用双亲委派机制,只是建议而已。其中tomcat服务器类加载器也使用代理模式,所不同的是它是首先尝试自己去加载某个类,如果找不到再代理给父类加载器。这与一般类加载器的顺序是相反的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值