【JVM】简述类加载器及双亲委派机制

双亲委派模型,是加载class文件的一种机制。在介绍双亲委派模型之前,我需要先介绍几种类加载器(Class Loader)。

1,类加载器

Bootstrap,加载lib/rt.jar,charset.jar等中的核心类,由C++实现。其实就是加载的我们通常部署的jdk中的jar包。
在这里插入图片描述

Extension,加载扩展包,jre/lib/ext/*.jar,或者由-Djava.ext.dirs指定。pom中通过maven引入的依赖,就是由Ext类加载器加载而来。
在这里插入图片描述
App,加载classpath指定内容。就是加载我们自己编写的java类编译出来的class文件,这些类文件在idea中在target包下,在idea中可以查看和设定classpath的路径:
在这里插入图片描述
Custom,自定义类加载器,自定义的class loader。继承ClassLoader这个抽象类,重写findClass()方法即可实现自定义类加载器。

2,双亲委派机制

双亲委派机制是JVM加载并初始化class文件的机制,即JVM流程:Loading->Linking->Initializing中的Loading这一部分的机制。
在这里插入图片描述

双亲委派机制的流程如下:
在传入类的全限定名后,如java.lang.Object,JVM会首先去寻找类的class文件,挨个加载器去看看是否已经加载(前文已经说过类加载器加载类的范围不同),寻找顺序由下到上;
从下到上找了一遍都没有找到,说明该类的class文件不在JVM中就会从上到下的去让加载器尝试加载,如果该类不是这个加载器的范围,就不会加载,否则,加载器就会将这个类加载到JVM中。
双亲委派机制实质上是对类加载器的权限做了分级,并按照分级来进行寻找或加载。

在这里插入图片描述

3,Q&A

3.1,为什么双亲委派机制要区分不同的类加载器,使用一个加载器加载所有class文件不行吗?
使用不同的类加载器并进行加载权限上的区分,主要的作用是为了安全,试想一下,当使用一个加载器加载所有class文件时,那么加载权限上的混淆,使得这个加载器就可以自定义一个如java.lang.Object的类并加载,覆盖掉本来的object,这无疑是无法接受的。这就需要更重要的资源如jdk的class文件由单独一个类加载器加载,并且无法被其他加载器覆盖。

3.2,双亲委派机制为什么要这样从下到上的寻找、再从上到下的加载呢?
同样,也是为了安全。

为什么从上到下的加载?

比如我们还是自定义一个java.lang.Object,应该由Custom Classloader加载,如果不是优先由Bootstrap Classloader加载,而是Custom Classloader优先加载,那么会出现什么情况?custom加载后,就不会继续去bootstrap中加载,因为它会认为已经加载完毕了!所以,更重要的资源,应该优先加载,因此,jdk中的类->pom引入的依赖->自己编写的类编译出来的class文件(target目录中的class文件)->自定义加载器加载(可以自定义加载文件的位置和加载方式)

为什么要从下到上的寻找?

这里我的理解就是,如果有自定义的加载器,我们肯定是希望优先使用我们自定义的custom加载器的。如果没有,剩下App、Ext、Bootstrap三个加载器。这三个加载器,更重要的资源被加载过的可能性更大,因此查找的顺序放在后面;而如App加载自己编写的类的class文件,没有被加载过的可能性更大,因此优先查找。

3.3,双亲委派机制叫这个名字,是因为这些类是从上到下的继承关系吗?
并不是。双亲委派机制,名字翻译的不好,实际上这个机制就是指的孩子向父亲委派、父亲向孩子委派的过程。

实质上,Bootstrap是由C++实现的组件,Custom可以自定义一个继承抽象类ClassLoader,重写findClass()方法即可。而App和Ext,不是继承的关系,如下图:

在这里插入图片描述

3.4,能不能打破双亲委派机制
可以的。在自定义Custom类加载器,重写findClass()方法时,当找不到类时不要去向上寻找App类加载器,自然也就打破了双亲委派机制。

4.ClassLoader源码片段

ClassLoader是一个抽象类,其中寻找class文件的loadClass方法,从中可以一窥双亲委派的机制(Ext没有重写这个方法,使用的就是ClassLoader的这个方法)。

注意这里的parent指的是查找顺序上的parent,而不是通常所指的继承关系上的parent。

在这里插入图片描述

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

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

相关文章

港口数据复杂不知道如何监控?来试试FineVis所展现的智慧港口看板

一、智慧港口是什么 智慧港口代表着港口建设的未来趋势和发展方向。以信息物理系统为框架,智慧港口通过创新应用高新技术,实现了物流供给方和需求方之间的沟通,并将它们融入集疏运一体化系统中。这种系统极大地提升了港口及其相关物流园区对…

ospf路由过滤及策略实验

目录 一、实验拓扑 二、实验要求 三、实验思路 四、实验步骤 1、配置IP 2、配置RIP协议和OSPF协议 3、在R2上做双向路由引入 (1)进入到rip协议的1进程中引入ospf (2)进入到ospf协议的1进程中引入rip 4、在R2上使用acl和…

逻辑回归实战 -- 是否通过考试

http://链接: https://pan.baidu.com/s/1-uy-69rkc4WjMpPj6iRDDw 提取码: e69y 复制这段内容后打开百度网盘手机App,操作更方便哦 数据集下载链接 这是个二分类问题,通过x1,x2两个指标得出是否通过考试的结论。 逻辑回归的激活函数是sigmoid函数&…

【论文阅读】ChipNeMo中的数据集处理

前面总体学习了《ChipNeMo: Domain-Adapted LLMs for Chip Design》,然后又继续仔细看了论文中的领域适配分词和领域数据微调的预训练检索模型,对于数据集的处理,也需要仔细看一下。 提炼重点:1)对于数据集&#xff0…

二维码门楼牌管理应用平台建设:创新社区管理模式

文章目录 前言一、二维码门楼牌管理应用平台的建设背景二、在线打卡功能的实现与意义三、查看浏览网格员在线打卡记录的重要性四、二维码门楼牌管理应用平台的未来展望五、结语 前言 随着信息技术的不断发展,社区管理正逐步迈向智能化、便捷化。二维码门楼牌管理应…

Databend 开源周报第 142 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持 WASM UDF …

Linux专栏01:Linux发展历史及背景介绍

博客主页:Duck Bro 博客主页系列专栏:Linux专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Linux发展历史及背景介绍 编号:01 文章目录 Linux发展历…

在kuboard中添加k8s集群

1.登录kuboard后,点击添加集群面板 系统会跳转到k8s集群添加页面,按照页面提示输入自身的集群信息即可,此处没有什么难点。 添加成功后,点击集群面板,然后点击集群概要信息,就可以查看集群节点信息。 集群节…

C++-8

1.C中list容器实现 using namespace std;int main() {list<int> l1;l1.assign(2,3);list<int>::iterator n l1.begin();for(n l1.begin();n!l1.end();n){cout << *n << "\t";}cout << endl;cout << "last one " &l…

【书生浦语第二期实战营学习笔记作业(七)】

课程文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/opencompass/readme.md 课程作业&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/opencompass/homework.md OpenCompass 大模型评测实战 1. 大模型的评测1.1 大模型评测如何促进发展1.2 大…

Flink checkpoint 源码分析- Flink Checkpoint 触发流程分析

序言 最近因为工作需要在阅读flink checkpoint处理机制&#xff0c;学习的过程中记录下来&#xff0c;并分享给大家。也算是学习并记录。 目前公司使用的flink版本为1.11。因此以下的分析都是基于1.11版本来的。 在分享前可以简单对flink checkpoint机制做一个大致的了解。 …

城会玩,Selenium+Docker成功解决这一大难题

01、需求背景 日常测试中会遇到对web应用进行UI自动化的测试场景&#xff0c;一般常用的工具是使用Selenium&#xff0c;一套简单的UI自动化架构如下&#xff1a; 上图即为简单搭建的一套UI自动化测试架构&#xff0c;但 串行执行测试用例&#xff1a; 一台机器只能安装一个…

[Meachines][Hard]FormulaX

Main $ nmap -sC -sV 10.10.11.6 --min-rate 1000 # echo 10.10.11.6 formula.htb>>/etc/hosts 创建一个新用户,登录 来到聊天窗口,发现普通用户无法使用 来到联系页面,测试跨站 {"first_name":"<img srchttp://10.10.16.6/s-h4ck13/>",&qu…

form1弹出子窗体form2,拖动子窗体判断是否离开父窗体区域,含源码(学习笔记)

一、效果&#xff08;进入和离开&#xff09; 子窗体到达父窗体边缘时变色。 二、代码分析 判断父窗体的目的&#xff0c;可以控制子窗体要随父窗体走。上面代码需要加以处理。 如&#xff1a;this.Location new Point(parentPoint.X distanceFromEdge, this.Location.Ydis…

给rwkv_pytorch增加rag

RAG 参考地址语义模型地址选择该模型使用方法方法二安装方法下载模型到本地材料材料处理语义分割计算得分根据得分 分割文本 构建向量数据库问答匹配问答整合 参考地址 RAG简单教程 分割策略 语义模型地址 hf 选择该模型 gte 使用方法 import torch.nn.functional as F…

AQS共享模式之CyclicBarrier

概念&#xff1a;CyclicBarrier翻译为循环(屏障/栅栏)&#xff0c;当一组线程到达一个屏障&#xff08;同步点&#xff09;时被阻塞&#xff0c;直到最后一个线程到达屏障时&#xff0c;屏障才会打开&#xff0c;所有被屏障拦截的线程才会继续工作。 设计目的&#xff1a;和Co…

当你老了:献给40岁以上还在求职的朋友

怪盗团团长按&#xff1a;本文作者是我的一位老朋友&#xff0c;他已经年过四十&#xff0c;在国内职场&#xff0c;算是不折不扣的中老年人了。难能可贵的是&#xff0c;最近他还换了工作&#xff0c;去了一个自己不熟悉的新行业奋斗。 我一直很纳闷&#xff0c;为何在中国&am…

该安装包不适配当前高性能处理器 请使用 64 位安装包

今天一台用户的一台手机报错&#xff0c;如下&#xff1a; 该安装包不适配当前高性能处理器 请使用 64 位安装包 查了下&#xff0c;网上也有人反馈该问题 https://ask.dcloud.net.cn/question/186865 最后在贴吧上发现答案&#xff1a;https://tieba.baidu.com/p/8773132859 …

Bluetooth Profile 蓝牙协议栈总结

GAP-Generic Access Profile 控制设备广播和连接 GAP profile 的目的是描述&#xff1a; Profile rolesDiscoverability modes and proceduresConnection modes and proceduresSecurity modes and procedures 设备连接过程 LE中GAP有4种角色&#xff1a;BroadcasterObserv…

使用groovy+spock优雅的进行单测

使用groovyspock优雅的进行单测 1. groovyspock示例1.1 简单示例1.2 增加where块的示例1.3 实际应用的示例 2. 单测相关问题2.1 与SpringBoot融合2.2 单测数据与测试数据隔离2.3 SQL自动转换&#xff08;MySQL -> H2&#xff09; 参考 Groovy是一种基于JVM的动态语言&#x…
最新文章