【JVM基础篇】双亲委派机制介绍

news2024/11/24 18:39:08

文章目录

    • 双亲委派机制
      • 简介
        • 案例:自底向上查找
        • 案例:自顶向下加载
        • 案例:C类在当前程序的classpath中
      • 双亲委派机制的作用
      • 如何指定加载类的类加载器?
      • 面试题
        • 如果一个类重复出现在三个类加载器的加载位置,应该由谁来加载?
        • String类能覆盖吗,在自己的项目中去创建一个java.lang.String类,会被加载吗?
        • 为什么叫双亲委派机制,加载器不是只有父亲吗?
        • **类的双亲委派机制是什么?**
        • 如果三个类加载器都都无法成功加载类会怎么样?
        • 拓展类加载器的parent是null,那向上查找的时候,如何拿到启动类加载器?
      • Arthas中类加载器相关功能
    • 文章说明

双亲委派机制

简介

双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过,如果没有加载过,再由顶向下进行加载。

每个Java实现的类加载器中保存了一个成员变量叫"父”(Parent)类加载器。自底向上查找是否加载过,再由顶向下进行加载,避免了核心类被应用程序重写并覆盖的问题,提升了安全性。

在这里插入图片描述

【详细流程】

每个类加载器都有一个父类加载器,父类加载器的关系如下,启动类加载器没有父类加载器

在这里插入图片描述

拓展类加载器的parent是null,因为无法获取c++源码的启动类加载器

在这里插入图片描述

在类加载的过程中,每个类加载器都会先检查是否已经加载了该类,如果已经加载则直接返回,否则会将加载请求委派给父类加载器

案例:自底向上查找

比如com.itheima.my.A假设在启动类加载器的加载目录中,而应用程序类加载器接到了加载类的任务。

1、应用程序类加载器首先判断自己加载过没有,没有加载过就交给父类加载器 - 扩展类加载器。

在这里插入图片描述

2、扩展类加载器也没加载过,交给他的父类加载器 - 启动类加载器。

在这里插入图片描述

3、启动类加载器发现已经加载过,直接返回。

在这里插入图片描述

案例:自顶向下加载

B类在扩展类加载器加载路径中,同样应用程序类加载器接到了加载任务,按照案例1中的方式一层一层向上查找,发现都没有加载过。那么启动类加载器会首先尝试加载。它发现这类不在它的加载目录中,向下传递给扩展类加载器(父加载器加载不了,传给子类,让其加载)

在这里插入图片描述

扩展类加载器发现这个类在它加载路径中,加载成功并返回。

在这里插入图片描述

如果第二次再接收到加载任务,同样地向上查找。扩展类加载器发现已经加载过,就可以返回了。

在这里插入图片描述

案例:C类在当前程序的classpath中

启动类加载器、拓展类加载器都不能加载,只能向下找到应用程序加载器来加载

在这里插入图片描述

双亲委派机制的作用

解决一个类到底由哪个类加载器加载的问题。

  1. 保证类加载的安全性:通过双亲委派机制避免恶意代码替换JDK中的核心类库,比如java.lang.String,确保核心类库的完整性和安全性。
  2. 避免重复加载:双亲委派机制让一个类只被一个类加载器加载,避免同一个类被多次加载。

如何指定加载类的类加载器?

在Java中如何使用代码的方式去主动加载一个类呢?

  • 方式1:使用Class.forName方法,使用当前类的类加载器去加载指定的类。
  • 方式2:获取到类加载器,通过类加载器的loadClass方法指定某个类加载器加载。

例如:

在这里插入图片描述

面试题

如果一个类重复出现在三个类加载器的加载位置,应该由谁来加载?

启动类加载器加载,根据双亲委派机制,它的优先级是最高的

String类能覆盖吗,在自己的项目中去创建一个java.lang.String类,会被加载吗?

不能,因为启动类加载器已经加载过String类,会返回启动类加载器加载在rt.jar包中的String类。双亲委派机制,避免核心类被覆盖,保证代码的安全性

在这里插入图片描述

为什么叫双亲委派机制,加载器不是只有父亲吗?

其实是parent翻译过来,翻译成了双亲

类的双亲委派机制是什么?
  • 当一个类加载器去加载某个类的时候,会自底向上查找是否加载过,如果加载过就直接返回,如果一直到最顶层的类加载器都没有加载,再由顶向下进行加载。
  • 应用程序类加载器的父类加载器是扩展类加载器,扩展类加载器的父类加载器是启动类加载器。
  • 双亲委派机制的好处有两点:
    • 第一是避免恶意代码替换JDK中的核心类库,比如java.lang.String,确保核心类库的完整性和安全性。
    • 第二是避免一个类重复地被加载。
如果三个类加载器都都无法成功加载类会怎么样?

会报类无法找到错误,可以尝试加载一个不存在的类看看

在这里插入图片描述

拓展类加载器的parent是null,那向上查找的时候,如何拿到启动类加载器?

当扩展类加载器需要委托给其父加载器加载类时,它并不会像普通Java类加载器那样通过调用getParent()方法来获取父加载器的引用并调用父加载器的加载方法。相反,它会使用一种特殊的方式间接与启动类加载器交互,这个过程是JVM内部实现的,并不暴露给Java程序直接操作。

Arthas中类加载器相关功能

查看当前进程的父子类加载器关系

在这里插入图片描述

文章说明

该文章是本人学习 黑马程序员 的学习笔记,文章中大部分内容来源于 黑马程序员 的视频黑马程序员JVM虚拟机入门到实战全套视频教程,java大厂面试必会的jvm一套搞定(丰富的实战案例及最热面试题),也有部分内容来自于自己的思考,发布文章是想帮助其他学习的人更方便地整理自己的笔记或者直接通过文章学习相关知识,如有侵权请联系删除,最后对 黑马程序员 的优质课程表示感谢。

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

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

相关文章

css backdrop-filter 实现背景滤镜

官方给出的定义是:backdrop-filter属性允许您将图形效果(如模糊或颜色偏移)应用于元素后面的区域。因为它适用于元素后面的所有内容,所以要查看元素或其背景的效果,需要透明或部分透明。 大致分为以下10种&#xff1a…

【基于 PyTorch 的 Python 深度学习】5 机器学习基础(2)

前言 文章性质:学习笔记 📖 学习资料:吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容:根据学习资料撰写的学习笔记,该篇主要介绍了如何选择合适的激活函数、损失函数和优化器…

【系统架构师】-案例篇(三)NoSQL与分布式对象调用

1、NoSQL 一个基于Web 2.0的大型社交网络系统。就该系统的数据架构而言,李工决定采用公司熟悉的数据架构,使用通用的商用关系型数据库,系统内部数据采用中央集中方式存储。该系统投入使用后,初期用户数量少,系统运行平…

第二证券|北交所股票散户可以买吗?门槛多少?

北交所股票散户能够买,不过一般来说,北交所股票出资风险比较大,不适合资金实力不雄厚的散户。 北交所买卖权限注册条件:请求注册权限前20个买卖日的证券账户和资金账户内的财物日均不低于50万元,其间不包括经过融资融…

【资源分享】完胜谷歌翻译的Deepl翻译

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

【算法】动态规划之背包DP与树形DP

前言: 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列 【算法】动态规划之线性DP问题-CSDN博客 【算法】动态规划之背包DP问题(2024.5.11)-CSDN博客 背包…

银河麒麟服务器操作系统ssh服务无法启动报exit-code

尝试重装ssh服务后依然无法解决,查看日志journalctl -xe,发现可能是ssh配置文件权限问题导致的。 journalctl -xe AWARNING: UNPROTECTED PRIVATE KEY FILE! AA Permissions 0755 for /etc/ssh/ssh_host_rsa_key are too open. A It is required that …

EPAI手绘建模APP工程图工具栏

(2) 工程图工具栏 ① 模板 1) 打开模板选择页面。 图 306 工程图模板列表 2) 模板选择页面列出了可以使用的工程图模板类型,每个模板规定了工程的大小、方向、规格、标准、常用字段等。也包括一些空白模板,此时可以通过添加表格等注释自定义工程图样式…

苹果15适合用哪些充电宝充电?苹果15可以用充电宝推荐

在如今移动设备如此普遍的时代,充电宝已成为我们日常生活中不可或缺的一部分。对于拥有苹果15的用户来说,选择一款适合的充电宝尤为重要。因为接口以及苹果手机配置上的一个升级,市面上很多普通充电宝已经不能兼容苹果15充电了。苹果15作为一…

5.10.8 Transformer in Transformer

Transformer iN Transformer (TNT)。具体来说,我们将局部补丁(例如,1616)视为“视觉句子”,并将它们进一步划分为更小的补丁(例如,44)作为“视觉单词”。每个单词的注意力将与给定视…

ChatGLM 本地部署指南(问题解决)

硬件要求(模型推理): INT4 : RTX3090*1,显存24GB,内存32GB,系统盘200GB 如果你没有 GPU 硬件的话,也可以在 CPU 上进行推理,但是推理速度会更慢。 模型微调硬件要求更高。…

高效测评系统方案助力沃尔玛、亚马逊卖家提升产品销量

无论在哪个电商平台,测评确实是最有效的推广方式。测之前一定要选好产品,因为对于大部分卖家而言,不可能你店铺里所有的都是爆款,所以选择的是需要有潜力成为爆款的产品。测评是指通过搭建安全的环境模拟真实的买家购物行为&#…

AH1515-12v转3V20A电源芯片

AH1515-12v转3V20A电源芯片:一款强大的电源解决方案 在当今的电子设备领域,电源管理的重要性不言而喻。一款优秀的电源芯片能够为各种设备提供稳定、高效的电能转换。今天,我们将为大家介绍一款极具特色的电源芯片——AH1515。这款芯片将为您…

FMEA存在的五个主要不足及改进措施——FMEA软件

免费试用FMEA软件-免费版-SunFMEA 在制造业和产品设计领域,失效模式与影响分析(Failure Modes and Effects Analysis,简称FMEA)被广泛运用,用于预防潜在的设计或制造缺陷。然而,尽管FMEA在风险管理方面发挥…

【51】Camunda8-Zeebe核心引擎-Zeebe Gateway

概述 Zeebe网关是Zeebe集群的一个组件,它可以被视为Zeebe集群的联系点,它允许Zeebe客户端与Zeebe集群内的Zeebe代理进行通信。有关Zeebe broker的更多信息,请访问我们的附加文档。 总而言之,Zeebe broker是Zeebe集群的主要部分,它完成所有繁重的工作,如处理、复制、导出…

加州大学欧文分校英语高级语法专项课程01:Verb Tenses and Passives 学习笔记

Verb Tenses and Passives Course Certificate Course Intro 本文是学习 Verb Tenses and Passives 这门课的学习笔记。 文章目录 Verb Tenses and PassivesWeek 01: Simple, Progressive, and Perfect Verb Tenses ReviewLearning Objectives Present Perfect Tense Review L…

Spring Cloud Alibaba Sentinel 集成与限流实战(6)

项目的源码地址 Spring Cloud Alibaba 工程搭建(1) Spring Cloud Alibaba 工程搭建连接数据库(2) Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用(3) Spring Cloud Alibaba Ribbo…

MySQL————创建存储过程函数

存储过程使用大纲 有参数传递 delimiter $$ 声明一个名称为get_student_introduce create procedure add_student_infor( in p_userName VARCHAR(20),in p_phone VARCHAR(11),in p_sex char(2),in p_introduce VARCHAR(255)) 开始操作 BEGIN 撰写真正在操作DMLDQL都行 INSE…

Transformer模型详解04-Encoder 结构

文章目录 简介基础知识归一化作用常用归一化 残差连接 Add & NormFeed Forward代码实现 简介 Transformer 模型中的 Encoder 层主要负责将输入序列进行编码,将输入序列中的每个词或标记转换为其对应的向量表示,并且捕获输入序列中的语义和关系。 具…

(超详细讲解)实现将idea的java程序打包成exe (新版,可以在没有java的电脑下运行,即可以发给好朋友一起玩)

目录 实现打包到exe大概步骤 工具准备 1.将java程序文件打包成jar文件 2.准备好jre文件 3.使用exe4j软件打包好 4.最终打包 实现打包到exe大概步骤 1.打包需要满足的条件:将java文件转成jar文件的工具exe4j、 以及需要满足jdk1.8以上(因安装exe4…