JVM面试(四)类加载器和双亲委派机制

news2024/11/24 7:19:26

什么是类加载器?

简单来说的话,是用于实现“类加载动作”的加载器
“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(Class Loader)。

这里需要注意一个特点,对于任何一个类,都要根据这个类本身以及加载它的类加载器来共同确认其在Java虚拟机中的唯一性
有些拗口,但是希望各位同学能多念几遍理解一下。

从另一个角度来说,如果两类的名字相等,即使来自同一个.class文件,但是所用的类加载器不是同一个,虚拟机就不会认为是同一个类,是两个独立的类。

为什么需要双亲委派机制?

上面说了,不同类加载器加载出来的类,一定不相同。

所以,为了保护java底层本身的类不被篡改(比如java.lang.Object、java.lang.String)。
无论是在各种程序中,各种类加载器环境中都保证被同一个类加载器进行加载。
就是用双亲委派机制,全都委派给处于模型最顶端的启动类加载器进行加载。
如下图:
在这里插入图片描述

双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

其实代码也简单得很,如下:

protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
	// 首先,检查请求的类是否已经被加载过了
	Class c = findLoadedClass(name);
	if (c == null) {
		try {
		if (parent != null) {
			c = parent.loadClass(name, false);
		} else {
			c = findBootstrapClassOrNull(name);
		}
		} catch (ClassNotFoundException e) {
			// 如果父类加载器抛出ClassNotFoundException
			// 说明父类加载器无法完成加载请求
		}
		if (c == null) {
			// 在父类加载器无法加载时
			// 再调用本身的findClass方法来进行类加载
			c = findClass(name);
		}
	}
	if (resolve) {
		resolveClass(c);
	}
	return c;
}

破坏双亲委派机制

很好理解啊,加载类的时候不按照这个顺序APPClassLoader->Ext ClassLoader->BootStrap ClassLoader进行加载就算是打破了双亲委派机制呗。

比如tomcat,只要用过tomcat部署工程的都知道,我们是把项目打成war包,让在webapp文件夹下面,那么就意味着tomcat同时可以运行多个web程序。

那在多个项目里面就有可能存在相同名称和路径的类。为了防止他们不冲突,tomcat就给每个web应用都创建一个类加载器实例,WebAppClassLoader。
该类重写了loaderClass()方法,优先加载当前应用目录下的类,如果找不到了,再进入用双亲委派机制一层层寻找加载器。
这其实算是一个双亲委派机制的补丁。

还有一种情况,双亲委派机制本身的模型就是“越基础的类,越由上层加载器来加载”。 那么什么是“基础”类? 就是哪些总作为被继承、调用API存在的类。 但是,如果存在那种,既有基础类型,又要回调用户代码怎么办?

这里最典型的就是JDBC,JDBC定义类接口,但是实现类肯定是由各个厂商来实现的, 比如mysql。
我们使用jdbc的时候,通过DriverManager来获取connection链接的,明显DriverManager是基础类,由BootstrapClassLoader加载的。

但是在我们使用DriverManager.getConnection()的时候,获取的一定是数据库厂商的类,BootstrapClassLoader不可能加载到第三方厂商的类啊。
解决方案就是,DriverManager在初始化的时候获取「线程上下文加载器」(Thread Context ClassLoader),在获取connection的时候使用线程上下文加载器来加载connection,这里的线程上下文加载器实际上还是App ClassLoader。
所以在获取connection的时候先找ExtClassLoader和BootstrapClassLoader加载器,只不过这俩加载器肯定加载不到,最终还是由AppClassLoader来加载。

其实话说回来,这些也可以算作双亲委派机制的加强补丁,并不是“破坏”双亲委派机制。 仁者见仁智者见智吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2101177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web测试(知识总结)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 随着Internet和Internet/Extranet的快速增长&#xff0c;Web已经对商业、工业、银行、财政、教育、政府和娱乐及我们的工作和生活产生了深远的影响。许多传统的…

代码随想录打卡第10天

232 用队列实现栈 两个栈一个负责入一个负责出。 class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue() {stackInnew Stack<>();stackOut new Stack<>();}public void push(int x) {stackIn.push(x);}public int pop() {…

axure9勾选多个删除,弹框显示多个中继器编号

文本框 情形是删除逗号 文本框内插入数据

分类预测|基于雪消融优化极端梯度提升的数据分类预测Matlab程序SAO-XGBoost 多特征输入多类别输出

分类预测|基于雪消融优化极端梯度提升的数据分类预测Matlab程序SAO-XGBoost 多特征输入多类别输出 文章目录 一、基本原理SAO&#xff08;雪消融智能优化算法&#xff09;回归预测中的应用XGBoost 回归预测基本原理SAO-XGBoost 流程 二、实验结果三、核心代码四、代码获取五、总…

Json数据解析报错 -TAB

表现&#xff1a; n8n 解析服务器的数据 报错 json 解析错误 原理&#xff1a; tab键 在代码中为 string tab \t解决办法&#xff1a;tab键替换4个空格 string tab "\t" tab.replaceAll("\t", " ")问题&#xff1a; tab 键 和 空格 在普…

特殊教育学校自闭症:提供个性化教学,满足孩子需求

在特殊教育领域&#xff0c;针对自闭症儿童的个性化教学已成为一种趋势&#xff0c;旨在通过量身定制的教育方案&#xff0c;最大限度地满足每位孩子的独特需求。星启帆自闭症儿童康复机构&#xff0c;作为广州地区的一颗璀璨明珠&#xff0c;正是这一理念的忠实践行者。 星启帆…

什么叫3d建模渲染?与云渲染农场关系

3D建模渲染行业是一个涉及多个行业和领域的技术过程&#xff0c;它不仅仅是一个特点行业的产物&#xff0c;而是广泛应用于产品设计、工业设计、环境设计、动画、游戏建模和影视CG等多个领域。那么3D建模渲染又与云渲染农场有什么关系呢&#xff0c;一起来简单看看吧。 什么叫3…

音频原始数据PCM

PCM全称是脉冲编码调制数据。PCM数据是未经过压的音频数据&#xff0c;它由模拟信号信号经过采样、编码等步骤抓换成的数字信号。 一、音频基础知识讲解 1.1频率 声音是由震动产生的&#xff0c;所以声音是有频率的&#xff0c;人类可以听到的声音频率大概在20HZ~20KHZ 1.2振…

宠物空气净化器真的有用吗?去浮毛好用的宠物空气净化器推荐

不知不觉我已经养宠五年了&#xff0c;一人两猫作伴的日子充满着幸福&#xff0c;可猫毛的存在偶尔也会让小家出现裂缝。每当换毛季&#xff0c;我的鼻子就率先作出反应&#xff0c;瘙痒加上止不住喷嚏都在反映着不佳的空气质量。这都是因为猫咪疯狂掉毛&#xff0c;浮毛上附着…

最新车型库大全|阿里云实现调用API接口

整体请求流程&#xff1a; 介绍&#xff1a; 本次解析通过阿里云云市场的云服务来实现查询车型库大全查询&#xff0c;首先需要选择一家可以提供查询的商品。 [探数API]车型库查询_API专区_云市场-阿里云 步骤1: 选择商品 如图点击免费试用&#xff0c;即可免费申请该接口数…

Power BI Desktop突然自动关闭如何恢复未保存的开发内容?

故事背景 今天有位同事在用Power BI Desktop开发报告的时候&#xff0c;Power BI Desktop软件突然自动关闭时&#xff0c;更让同事郁闷的是开发了两个小时的报告内容还未点击保存&#xff01; 同事非常担心会丢失未保存的报告开发内容&#xff0c;找我寻求帮助如何恢复未保存…

无人机培训校企合作技术详解

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、环境监测、应急救援等多个领域展现出巨大的应用潜力&#xff0c;市场对无人机专业人才的需求也日益增长。因此&#xff0c;加强无人机培训领域的校企合作&#xff0c;成为培养高素质无人机技术人才的重要途径。本文将从合…

企业为什么要使用加密软件?哇!原来有这么多好处呢

1、防止内部泄密&#xff1a;加密软件可以限制文件的访问权限&#xff0c;防止机密文件在公司内部随意流转。 2、访问控制&#xff1a;加密软件可以设定严格的访问控制策略&#xff0c;确保只有授权用户才能访问敏感数据。 3、提升数据恢复能力&#xff1a;通过加密备份数据&…

redis学习(011 实战:黑马点评:优惠券秒杀:redis实现全局唯一ID)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第48p-第p49的内容 文章目录 全局唯一ID编码 全局唯一ID //String did dao.haveKeyId(“deputybedthing”); 这里的主键并没有…

基于微信小程序在线订餐系统

微信小程序在线订餐系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序在线订餐系统的开发全过程。通过分析微信小程序在线订餐系统管理的不足&#xff0c;创建了一个计算机管理微信小程序在线订…

惠中科技光伏清洗剂:科技创新引领绿色清洁新风尚

惠中科技光伏清洗剂&#xff1a;科技创新引领绿色清洁新风尚 在光伏产业蓬勃发展的今天&#xff0c;光伏板的清洁问题日益凸显&#xff0c;成为影响发电效率的关键因素之一。面对传统清洗方法效率低、成本高、环境影响大等痛点&#xff0c;惠中科技以科技创新为驱动&#xff0…

sqlserver 如何收缩+最大化压缩数据库

zihao 直接运行即可 -- 最大化压缩数据库 USE [数据库名称]; -- 这里必须填写库名称 GO EXEC sp_MSforeachtable ALTER TABLE ? REBUILD PARTITION ALL WITH (DATA_COMPRESSION PAGE);;-- 收缩数据库 DBCC SHRINKDATABASE (N数据库名称, 1); -- 这里必须填写库名称 GO

COB超微小间距LED显示屏是什么,它的性价比怎么样,市场大有可为

COB&#xff08;Chip on Board&#xff09;技术最早发源于上世纪60年代&#xff0c;是将LED芯片直接封装在PCB电路板上&#xff0c;并用特种树脂做整体覆盖。COB实现“点” 光源到“面” 光源的转换。点间距有P0.3、P0.4、P0.5、P0.6、P0.7、P0.9、P1.25、P1.538、P1.5625、P1.…

【STM32+HAL库】---- 通用定时器PWM输出实现呼吸灯

硬件开发板&#xff1a;STM32G0B1RET6 软件平台&#xff1a;cubemaxkeilVScode1 新建cubemax工程 1.1 配置系统时钟RCC 1.2 配置定时器 找到LED所对应的引脚PA5&#xff0c;选择TIM2_CH1模式 在TIM2中&#xff0c;时钟源选择内部时钟Internal Clock&#xff0c;通道1选择PWM…

外业精灵实时查看区域等高线(如何显示等高线的高程值)

0.序 图新地球桌面端的等高线预览&#xff0c;既可以看到等高线&#xff0c;也能看到等高线的高程值。 而等高线生成功能&#xff0c;只有等高线没有高程值&#xff08;多少米&#xff09;的点标注。 导致生成的等高线不论是在图新地球桌面端、外业精灵&#xff08;手机端&…