`
chenzhou123520
  • 浏览: 4261086 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM学习笔记(八):类加载器以及双亲委派模型介绍

阅读更多

本章内容根据《深入理解Java虚拟机》第7章部分内容整理

 

   1.什么是类加载器?

   在类加载阶段,有一步是“通过类的全限定名来获取描述此类的二进制字节流”,而所谓的类加载器就是实现这个功能的一个代码模块,这个动作是在Java虚拟机外部实现的,这样做可以让应用程序自己决定如何去获取所需要的类。

   类加载器的作用:首先类加载器可以实现最本质的功能即类的加载动作。同时,它还能够结合java类本身来确定该类在Java虚拟机中的唯一性。用通俗的话来说就是:比较两个类是否相等,只有这两个类是由同一个类加载器加载才有意义。否则,即使这两个类是来源于同一个Class文件,只要加载它们的类加载器不同,那么这两个类必定不相等。

   2.双亲委派模型

   从虚拟机的角度来说,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),该类加载器使用C++语言实现,属于虚拟机自身的一部分。另外一种就是所有其它的类加载器,这些类加载器是由Java语言实现,独立于JVM外部,并且全部继承自抽象类java.lang.ClassLoader。

   从Java开发人员的角度来看,大部分Java程序一般会使用到以下三种系统提供的类加载器:

   1)启动类加载器(Bootstrap ClassLoader):负责加载JAVA_HOME\lib目录中并且能被虚拟机识别的类库到JVM内存中,如果名称不符合的类库即使放在lib目录中也不会被加载。该类加载器无法被Java程序直接引用。

   2)扩展类加载器(Extension ClassLoader):按《深入理解java虚拟机》这本书上所说,该加载器主要是负责加载JAVA_HOME\lib\ext目录中的类库,但是貌似在JDK的安装目录下,没看到该指定的目录。该加载器可以被开发者直接使用。

   3)应用程序类加载器(Application ClassLoader):该类加载器也称为系统类加载器,它负责加载用户类路径(Classpath)上所指定的类库,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

   我们的应用程序都是由这三类加载器互相配合进行加载的,我们也可以加入自己定义的类加载器。这些类加载器之间的关系如下图所示:

类加载器的双亲委派模型

   如上图所示的类加载器之间的这种层次关系,就称为类加载器的双亲委派模型(Parent Delegation Model)。该模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。子类加载器和父类加载器不是以继承(Inheritance)的关系来实现,而是通过组合(Composition)关系来复用父加载器的代码。

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

   使用这种模型来组织类加载器之间的关系的好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如java.lang.Object类,无论哪个类加载器去加载该类,最终都是由启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。否则的话,如果不使用该模型的话,如果用户自定义一个java.lang.Object类且存放在classpath中,那么系统中将会出现多个Object类,应用程序也会变得很混乱。如果我们自定义一个rt.jar中已有类的同名Java类,会发现JVM可以正常编译,但该类永远无法被加载运行。

   在rt.jar包中的java.lang.ClassLoader类中,我们可以查看类加载实现过程的代码,具体源码如下:

protected synchronized Class<?> loadClass(String name, boolean resolve)	throws ClassNotFoundException{
	// First, check if the class has already been loaded
	Class c = findLoadedClass(name);
	if (c == null) {
		try {
			if (parent != null) {
				c = parent.loadClass(name, false);
			} else {
				c = findBootstrapClassOrNull(name);
			}
		} catch (ClassNotFoundException e) {
			// ClassNotFoundException thrown if class not found
			// from the non-null parent class loader
		}
		if (c == null) {
			// If still not found, then invoke findClass in order
			// to find the class.
			c = findClass(name);
		}
	}
	if (resolve) {
		resolveClass(c);
	}
	return c;
}

 

   通过上面代码可以看出,双亲委派模型是通过loadClass()方法来实现的,根据代码以及代码中的注释可以很清楚地了解整个过程其实非常简单:先检查是否已经被加载过,如果没有则调用父加载器的loadClass()方法,如果父加载器为空则默认使用启动类加载器作为父加载器。如果父类加载器加载失败,则先抛出ClassNotFoundException,然后再调用自己的findClass()方法进行加载。

0
0
分享到:
评论

相关推荐

    白色卡通风格响应式游戏应用商店企业网站模板.zip

    白色卡通风格响应式游戏应用商店企业网站模板.zip

    48页-智慧工地监管平台解决方案.pdf

    智慧工地,作为现代建筑施工管理的创新模式,以“智慧工地云平台”为核心,整合施工现场的“人机料法环”关键要素,实现了业务系统的协同共享,为施工企业提供了标准化、精益化的工程管理方案,同时也为政府监管提供了数据分析及决策支持。这一解决方案依托云网一体化产品及物联网资源,通过集成公司业务优势,面向政府监管部门和建筑施工企业,自主研发并整合加载了多种工地行业应用。这些应用不仅全面连接了施工现场的人员、机械、车辆和物料,实现了数据的智能采集、定位、监测、控制、分析及管理,还打造了物联网终端、网络层、平台层、应用层等全方位的安全能力,确保了整个系统的可靠、可用、可控和保密。 在整体解决方案中,智慧工地提供了政府监管级、建筑企业级和施工现场级三类解决方案。政府监管级解决方案以一体化监管平台为核心,通过GIS地图展示辖区内工程项目、人员、设备信息,实现了施工现场安全状况和参建各方行为的实时监控和事前预防。建筑企业级解决方案则通过综合管理平台,提供项目管理、进度管控、劳务实名制等一站式服务,帮助企业实现工程管理的标准化和精益化。施工现场级解决方案则以可视化平台为基础,集成多个业务应用子系统,借助物联网应用终端,实现了施工信息化、管理智能化、监测自动化和决策可视化。这些解决方案的应用,不仅提高了施工效率和工程质量,还降低了安全风险,为建筑行业的可持续发展提供了有力支持。 值得一提的是,智慧工地的应用系统还围绕着工地“人、机、材、环”四个重要因素,提供了各类信息化应用系统。这些系统通过配置同步用户的组织结构、智能权限,结合各类子系统应用,实现了信息的有效触达、问题的及时跟进和工地的有序管理。此外,智慧工地还结合了虚拟现实(VR)和建筑信息模型(BIM)等先进技术,为施工人员提供了更为直观、生动的培训和管理工具。这些创新技术的应用,不仅提升了施工人员的技能水平和安全意识,还为建筑行业的数字化转型和智能化升级注入了新的活力。总的来说,智慧工地解决方案以其创新性、实用性和高效性,正在逐步改变建筑施工行业的传统管理模式,引领着建筑行业向更加智能化、高效化和可持续化的方向发展。

    基于卷积神经网络的AV1视频编码环路滤波技术

    内容概要:本文提出了一种基于卷积神经网络(CNN)的AV1视频编码环路滤波方法。该方法利用深度可变的简单网络结构SimNet,针对不同量化参数(QP)调整网络深度,从而提高编码效率和视觉质量。同时,作者提出了一种适用于INTER编码的跳过增强策略,以避免重复增强导致的图像质量下降。实验结果表明,该方法在INTRA和INTER编码模式下分别实现了平均7.27%和5.57%的BD-rate降低,且在编码时间上优于AV1基准。 适合人群:视频编码研究人员、AI开发者、多媒体技术专家。 使用场景及目标:适用于提升视频压缩编码的效率和视觉质量,特别是对于AV1视频编码标准的应用。 其他说明:该方法不仅提高了编码效率和视觉质量,还降低了计算复杂度。

    白色简洁风格的商业投资组合网站HTML5模板.zip

    白色简洁风格的商业投资组合网站HTML5模板.zip

    在线式缠绕膜机自动覆膜缠绕机sw16全套技术资料100%好用.zip

    在线式缠绕膜机自动覆膜缠绕机sw16全套技术资料100%好用.zip

    (176109030)基于ESO的永磁同步电机无感FOC1.采用线性扩张状态观测器(LESO)估计电机反电势,利用锁相环从反电势中提取位置和转速信息

    基于ESO的永磁同步电机无感FOC 1.采用线性扩张状态观测器(LESO)估计电机反电势,利用锁相环从反电势中提取位置和转速信息,从而实现无位置传感器控制; 2.提供算法对应的参考文献和仿真模型。 购买赠送PMSM控制相关电子资料。 仿真模型纯手工搭建,不是从网络上复制得到。 仿真模型仅供学习参考。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    白色简洁风格的酒店展示及预订企业网站源码下载.zip

    白色简洁风格的酒店展示及预订企业网站源码下载.zip

    白色简洁风格的享受旅行导航指南整站网站源码下载.zip

    白色简洁风格的享受旅行导航指南整站网站源码下载.zip

    白色简洁风格的照片浏览切换源码下载.rar

    白色简洁风格的照片浏览切换源码下载.rar

    白色简洁风格的女装商城整站网站源码下载.zip

    白色简洁风格的女装商城整站网站源码下载.zip

    EnvironmentError.md

    EnvironmentError.md

    白色简洁风格的举重锻炼健身企业网站模板.zip

    白色简洁风格的举重锻炼健身企业网站模板.zip

    html+css+js网页设计 美食 家美食1个页面

    预览地址:https://blog.csdn.net/qq_42431718/article/details/144758683 html+css+js网页设计 美食 家美食1个页面

    白色简洁风格的室内家具展示企业网站源码下载.zip

    白色简洁风格的室内家具展示企业网站源码下载.zip

    白色简洁风格的婚礼活动展示信息源码下载.zip

    白色简洁风格的婚礼活动展示信息源码下载.zip

    Python绘制圣诞树:文本和图形实现

    内容概要:本文详细介绍了使用Python绘制圣诞树的方法,包括简单的文本圣诞树、使用Turtle库绘制复杂图形圣诞树,以及添加装饰和动态效果的高级应用。文章通过代码示例和详细的解释,逐步展示了如何实现不同风格的圣诞树。 适合人群:Python初学者,特别是对图形编程感兴趣的读者。 使用场景及目标:① 学习如何使用Python的字符串操作和循环结构绘制文本圣诞树;② 掌握Turtle库的基本用法,绘制复杂的图形圣诞树;③ 添加装饰和动态效果,提升节日氛围。 阅读建议:建议读者跟随代码示例进行实践,结合注释和解释,更好地理解和掌握每个步骤的实现方法。

    白色简洁风格的宴席精致餐饮整站网站源码下载.zip

    白色简洁风格的宴席精致餐饮整站网站源码下载.zip

    基于STM32f103的红外测温仪程序(测温模块MLX90614,芯片GY906)

    采用STM32F103系列作为主控,利用MLX90614采集温度,配以OLED显示以及flash存储数据

    html渲染器,粘贴html代码到这个渲染器即可渲染出对应的效果

    html渲染器,粘贴html代码到这个渲染器即可渲染出对应的效果

    在线教育平台:课程管理与学习分析

    随着学业负担的日益加重,越来越多的学生选择通过家教、自学或参加补习班来加强课外学习。然而,家教费用高昂,自学效率低下且难以及时解决疑难问题,而补习班则受限于时间和地点,灵活性不足。此外,国家政策也不鼓励校外补习。鉴于网络技术的成熟和各类在线平台的兴起,开发一个专业的在线辅助学习网站对于辅助学生的课外学习显得尤为重要。 本在线教育系统基于Vue.js构建,采用B/S架构设计,后端语言为Java,数据库使用MySQL。通过整合Vue.js技术,系统界面更加丰富和友好。系统主要面向课程购买用户,涉及的角色包括管理员、学生和教师。学生可以注册登录后浏览课程视频、收藏课程、留言并购买课程,同时实现订单管理。管理员负责管理学生信息、课程信息、发布班级和管理章节等。教师则可以管理课程订单、课程内容和章节。该系统允许学生利用碎片时间自主学习,具有很高的灵活性,对于难以理解的课程可以反复学习并在线提问,极大地促进了学生的学习。

Global site tag (gtag.js) - Google Analytics