JVM 双亲委派机制详解

文章目录

  • 1. 双亲委派机制
  • 2. 证明
  • 3. 优势与劣势


在这里插入图片描述

在这里插入图片描述


1. 双亲委派机制

类加载器用来把类加载到 Java 虚拟机中。从JDK1.2版本开始,类的加载过程采用双亲委派机制,这种机制能更好地保证 Java 平台的安全。

1.定义
如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回。只有父类加载器无法完成此加载任务时,才自己去加载。

2.本质
规定了类加载的顺序是:引导类加载器先加载,若加载不到,由扩展类加载器加载,若还加载不到,才会由系统类加载器或自定义的类加载器进行加载。


在这里插入图片描述
在这里插入图片描述


2. 证明

双亲委派机制在 java.lang.ClassLoader.loadClass(String,boolean) 接口中体现。该接口的逻辑如下:
(1)先在当前加载器的缓存中查找有无目标类,如果有,直接返回。
(2)判断当前加载器的父加载器是否为空,如果不为空,则调用parent.loadClass(name, false)接口进行加载。
(3)反之,如果当前加载器的父类加载器为空,则调用findBootstrapClassOrNull(name)接口,让引导类加载器进行加载。
(4)如果通过以上3条路径都没能成功加载,则调用findClass(name)接口进行加载。该接口最终会调用java.lang.ClassLoader接口的defineClass系列的native接口加载目标 Java 类。
双亲委派的模型就隐藏在这第2和第3步中。

2.举例
假设当前加载的是java.lang.Object这个类,很显然,该类属于JDK中核心得不能再核心的一个类,因此一定只能由引导类加载器进行加载。当JVM准备加载javaJang.Object时,JVM默认会使用系统类加载器去加载,按照上面4步加载的逻辑,在第1步从系统类的缓存中肯定查找不到该类,于是进入第2步。由于从系统类加载器的父加载器是扩展类加载器,于是扩展类加载器继续从第1步开始重复。由于扩展类加载器的缓存中也一定査找不到该类,因此进入第2步。扩展类的父加载器是null,因此系统调用findClass(String), 最终通过引导类加载器进行加载。


3. 优势与劣势

1.双亲委派机制优势
避免类的重复加载,确保一个类的全局唯一性
Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关系可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。
保护程序安全,防止核心API被随意篡改

2.双亲委托模式的弊端
检查类是否加载的委托过程是单向的,这个方式虽然从结构上说比较清晰,使各个ClassLoader的职责非常明确,但是同时会带来一个问题,即顶层的ClassLoader无法访问底层的ClassLoader所加载的类。

通常情况下,启动类加载器中的类为系统核心类,包括一些重要的系统接口,而在应用类加载器中,为应用类。按照这种模式,应用类访问系统类自然是没有问题,但是系统类访问应用类就会出现问题。比如在系统类中提供了一个接口,该接口需要在应用类中得以实现,该接口还绑定一个工厂方法,用于创建该接口的实例,而接口和工厂方法都在启动类加载器中。这时,就会出现该工厂方法无法创建由应用类加载器加载的应用实例的问题。

3.结论
由于Java虚拟机规范并没有明确要求类加载器的加载机制一定要使用双亲委派模型,只是建议采用这种方式而已。
比如在Tomcat中,类加载器所采用的加载机制就和传统的双亲委派模型有一定区别,当缺省的类加载器接收到一个类的加载任务时,首先会由它自行加载,当它加载失败时,才会将类的加载任务委派给它的超类加载器去执行,这同时也是Servlet规范推荐的一种做法。


在这里插入图片描述



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最新极空间部署iCloudpd教程,实现自动同步iCloud照片到NAS硬盘

【iPhone福利】最新极空间部署iCloudpd教程,实现自动同步iCloud照片到NAS硬盘 哈喽小伙伴们好,我是Stark-C~ 我记得我前年的时候发过一篇群晖使用Docker部署iCloudpd容器来实现自动同步iCloud照片的教程,当时热度还很高,可见大家…

MySQL旧表做分区流程

1. 为什么做分区 数据库分区是将数据库中的数据划分成独立的部分,每个部分称为一个分区。分区可以根据特定的标准,如范围、列表或哈希值,将数据分隔到不同的物理存储位置中。数据库表分区可以在多种情况下提供显著的好处。以下是一些应该考虑…

如何对基本公共服务均等化进行统计监测

党的十九大指出“履行好政府再分配调节职能,加快推进基本公共服务均等化,缩小收入分配差距”,提出到2035年基本公共服务均等化基本实现。国务院相继于2012年和2017年发布了《国家基本公共服务体系“十二五”规划》和《“十三五”推进基本公共…

Windows里使用ollama本地大模型部署

下载 ollama官网进行下载 下载完后下一步下一步即可 安装完成后验证是否成功,打开命令行输入ollama,有该指令即安装成功 环境变量配置 配置模型下载位置 看自己电脑硬盘情况配置 打开所有ip接口访问权限 如果想要远程调用ollama接口,…

Output directory is not specified

场景:从GitHub拉取Java项目使用IDEA打开运行的时候抛出 java: 写入com.common.exception.ChatException时出错: Output directory is not specified网上大部分是说在项目结构增加编译器输出路径,但我在实际开发的项目的时候这里为空,包括我加…

测试用例设计方法:招式组合,因果判定出世

1 引言 上篇讲了等价类划分和边界值分析法,而这两种方法只考虑了单个的输入条件,并未考虑输入条件的各种组合、输入条件之间的相互制约关系的场景。基于此短板,因果图法和判定表法应运而生。 2 因果图法 2.1 概念及原理 2.1.1 定义 一种…

分布式光伏监控系统功能模块详解

目前,分布式光伏发电系统的总容量比较小,并且光伏电站的功率受外界环境影响容易出现大起大落的现象。这使电压调整变得很困难。光伏电站运行维护人员不足,长时间不保养维护会影响光伏电站的发电效率。针对上述问题,鹧鸪云基于无线…

汇聚荣科技:拼多多开店没有流量应该怎么办?

拼多多开店没有流量是一个常见的问题,许多新手商家都会遇到这样的困境。那么,如何解决这个问题呢?下面从四个方面进行详细阐述。 一、优化店铺和商品 首先,要确保店铺和商品的质量。店铺要有自己独特的风格和特色,商品要有高质量…

Airtest核心API汇总

2024.2.25更新:新增剪切板、Airtest1.3.3touch/swipe支持绝对坐标和相对坐标 2023.9.3更新:Airtest1.2.7新增14个断言、断开连接API;Airtest1.2.10.2新增录屏API; 以下基于airtest1.2.0(截止2021.7.12,最新版本) https…

如何将公众号添加到CSDN个人主页

1. 创作中心- 推广管理 输入个人公众号名字并开启微信公众号推广 2. 将公众号的二维码图片加入拓展信息 个人主页的左下角就能看到推广 如果希望能看到是二维码 操作如下: 写篇文章贴上二维码 然后点击鼠标右键获得此页面链接 ,例如我的个人公众号 htt…

洗地机哪款好用?希亦、追觅、顺造、米家等高品质洗地机推荐

家用洗地机已经成为家庭清洁的重要利器,其多功能性能帮助您轻松应对各种清洁任务,从而保持家居环境的清洁整洁。然而,市场上品牌繁多、功能各异的洗地机让人眼花缭乱。为了帮助大家做出明智的选择,我们将在本文中提供全面的选购指…

力扣98.验证二叉搜索树

法一(自己思路,复杂了): from collections import dequeclass Solution(object):def isValidBST(self, root):""":type root: TreeNode:rtype: bool"""queue deque()if root.left!None:queue.app…

凸优化理论学习三|凸优化问题(一)

系列文章目录 凸优化理论学习一|最优化及凸集的基本概念 凸优化理论学习二|凸函数及其相关概念 文章目录 系列文章目录一、优化问题(一)标准形式的优化问题(二)可行点和最优点(三)局部最优点(四…

地平线X3开发板Intel Realsense深度相机调试记录

1. 预编译包 编译这个SDK花费了5.6个小时,为了方便各位后续使用, 各位可以直接下载编译好的文件,包含C和Python的库,相关文件已经上传至百度云(提取码:awe4 )。 在提供的这些文件中&#xf…

思科模拟器学习1--Vlan Trunk

实验说明:将三台电脑的vlan 加到一台交换机里面,为了验证什么是虚拟局域网,把一个设备隔成三个空间,三个电脑互相不能通讯;目的是:vlan 1的通讯不可以向vlan 2传送,就是消息传送互不干扰的&…

独家揭秘:亲历清华大学答辩现场,惊喜万分 名校答辩不简单

会议之眼 快讯 五月,对于学术界来说,迎来了答辩的高潮!是收获的季节!今天,趁着阳光明媚,小编怀揣着对学术探索的无限热情和好奇心,决定亲自踏入中国顶尖学术殿堂——清华大学深圳国际研究生院&…

【核弹】我的第一款IDEA插件

SuperHotSwap 插件名称叫做:SuperHotSwap(超级热更新) 开发初心:旨在做出一款最便捷的IDEA热更新插件,减少用户操作步骤,提供零配置的可视化操作更新。 为什么要写这个插件: 每次改一下Mappe…

Linux内核发送网络数据

前言 我们开始今天对 Linux 内核⽹络发送过程的深度剖析。还是按照我们之前的传统,先从⼀段代码作为切⼊。 上述代码中,调⽤ send 之后内核是怎么样把数据包发送出去的。本⽂基于Linux 3.10,⽹卡驱动采⽤Intel的igb举例。 基础框架 我们看…

08 必会框架 - Spring全家桶

本课时主要介绍 Java 中常用的应用框架,重点讲解如下三部分内容。 Spring 框架中的主要知识点; NIO 框架 Netty 以及基于 Netty 实现的主流 RPC 框架 Motan、Dubbo 和 gRPC; ORM 框架 MyBatis。 常用框架汇总 先来看常用框架的知识点汇总…

AuroraFOC使用指南一(STM32F405双路FOC)

一. 简介 哈喽,感谢各位选择AuroraFOC开发板,在这里将对其进行一个详细的介绍,方便大家使用。并且对提供的工程文件和上位机的操作也进行了详细的说明。 有什么疑问或者好的建议 可以微信联系: WU1356742146 最后再次感谢大家的支持。 Aur…