JVM双亲委派

本文深入探讨了JVM的双亲委派类加载机制,其主要目的是防止类重复加载和核心类篡改。然而,这一机制在实际应用中面临四次破坏,包括版本问题、SPI机制、线程上下文类加载器和动态部署。这些破坏导致了类加载行为的复杂性和灵活性。此外,JDK9的模块化构建进一步挑战了双亲委派。虽然双亲委派机制有其缺陷,如可能导致死锁,但通过增加并行能力等措施,可以缓解这些问题。

JVM双亲委派机制:
类加载:类加载时线程互斥,所以可以通过内部类进行创建
类加载原理:
向上加载向下委派
当类进行加载时,会寻找他的父类(递归),寻找到最高的父类时向下委派加载,直到不可向下委派为止。
约基础的类由约上层的加载器进行加载,但是如果基础类有调用回用户类->线程上下文类加载器
1、防止类重复加载无意义消耗资源。
2、防止核心类被用户类篡改加载。
双亲委派机制三次破坏:
第一次:
版本问题,双亲委派机制在JDK1.2引入。但类加载器和抽象类CLassLoader在JDK1.0就已经存在,面对已存在的用户自定义类加载器需要进行妥协。
第二次:
SPI机制:服务发现机制,当服务者提供了服务接口的一种实现后,在jar包的META-INF/services/目录里同时创建一个服务接口命名的文件。当JDK装配该模块时可以通过META-INF/services/的配置文件找到该类实现装载实例化。
线程上下文类加载器:当父类需要使用其他用户提供的jar包类时,需要在线程创建时委托线程设置上下文类加载器对其他接口实现的加载
当调用线程上下文类加载器时,会破坏双亲委派的,向上委派向下加载机制
第三次:
动态部署,例如代码热替换、模块热部署。每次热部署时会将当前部署类的类加载器一并替换
热部署类加载
->基础类java.*开头的类,给父类加载器
->委派列表名单的类,给父类加载器
->import引用列表的类,给Export(引用)类的Bundle(包)的类加载器
->查找当前Bundle(包)的Classpath(地址),使用自己类的类加载器
->查找是否存在本类的Fragment Bundle(通信)中,如果有就委派给Fragment Bundle(通信)的类加载器
->查找Dynamic Import(动态导入)列表的Bundle(包),给对应的Bundle的类加载器
->类查找失败
第四次:
JDK9的JDK基于模块化构建,由于model(模块化)构建单一职责的原因,所以会使用自己的类加载器进行加载
缺陷:
在高并发的情况下,如果两个包互相引用,A引用B,B依赖A的B包,会死锁
JDK7在ClassLoader(Class装载器)增加了registerAsParallelCapable方法,将所有级别从ClassLoader(Class装载器)降低了加载的级别

JVM中的双亲委派机制是一种类加载机制,它规定了在Java中一个类被加载时如何进行类加载器的选择。根据这个机制,当一个类需要被加载时,首先会由类加载器ClassLoader检查是否已经加载过该类,如果是,则直接返回已经加载过的类;如果不是,则将该请求委派给父类加载器去加载。这样的过程会一直向上委派,直到达到顶层的引导类加载器(Bootstrap ClassLoader)。引用 引用中提到,并不是所有的类加载器都采用双亲委派机制。Java虚拟机规范并没有强制要求使用双亲委派机制,只是建议使用。实际上,一些类加载器可能会采用不同的加载顺序,例如Tomcat服务器类加载器就是采用代理模式,首先尝试自己去加载某个类,如果找不到再代理给父类加载器。 引用中提到,引导类加载器(Bootstrap ClassLoader)是最早开始工作的类加载器,负责加载JVM的核心类库,例如java.lang.*包中的类。这些类在JVM启动时就已经被加载到内存中。 综上所述,JVM双亲委派机制是一种类加载机制,它通过类加载器的委派方式来加载类,首先检查是否已经加载过该类,如果没有则委派给父类加载器去加载,直到达到顶层的引导类加载器。不过,并不是所有的类加载器都采用该机制,一些类加载器可能会采用不同的加载顺序。引用<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JVM-双亲委派机制](https://blog.youkuaiyun.com/m0_51608444/article/details/125835862)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [jvm-双亲委派机制](https://blog.youkuaiyun.com/y08144013/article/details/130724858)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值