首页 > 其他分享 >双亲委派模型

双亲委派模型

时间:2024-05-29 12:59:24浏览次数:8  
标签:委派 loadClass 模型 双亲 方法 加载

双亲委派模型并不是一种强制性的约束,只是JDK官方推荐的一种方式。

每⼀个类都有⼀个对应它的类加载器。系统中的 ClassLoder 在协同⼯作的时候会默认使⽤ 双亲委派模型 。

JVM启动的时候,并不会一次性加载所有的类,而是根据需要去动态加载。也就是说,大部分类在具体用到的时候才会去加载,这样对内存更加友好。且在类加载的时候,系统会⾸先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。

加载的时候,他不会先去尝试自己去加载这个类,而是会把该请求委派该⽗类加载器的 loadClass() 去处理,因此所有的请求最终都应该传送到顶层的启动类加载器 BootstrapClassLoader 中。当⽗类加载器⽆法处理时(在它的加载路径下没有找到所需加载的 Class),才由⾃⼰来处理(调用自己的findclass()方法来加载类)。当⽗类加载器为null时,会使⽤启动类加载器BootstrapClassLoader 作为⽗类加载器。

7.1. 优点

1.保证JDK的核心类会被优先加载

2.保证java程序的稳定运行,可以避免类的重复加载,也保证了Java的核心API不会被篡改

3.不论是哪个类加载器去加载某个类,最终都是委托给顶层的启动类加载器去进行加载,这样就保证了使用不同的类加载器去加载最终获得的都是同一个Object对象

7.2. 破坏双亲委派机制:

自定义加载器的话,需要继承classLoader。如果我们不想打破双亲委派模型,就重写ClassLoader 类中的findclass()方法即可,无法被父类加载器加载的类最终会通过这个方法被加载。但是,如果想打破双亲委派模型则需要重写loadclass()方法。

7.2.1. 为什么是重写 loadclass()方法打破双亲委派模型呢?

双亲委派模型的执行流程已经解释了:

类加载器在进行类加载的时候,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成(调用父加载器 loadclass()方法来加载类)。

7.2.2. 方法:

  • 可以⾃⼰定义⼀个类加载器,重写loadClass方法;
  • Tomcat 可以加载自己目录下的 class 文件,并不会传递给父类的加载器;(阿里文章)
  • Java 的 SPI,发起者 BootstrapClassLoader 已经是最上层了,它直接获取了 AppClassLoader 进行驱动加载,和双亲委派是相反的。

7.3. JVM 判定两个Java 类是否相同的具体规则:

JVM不仅要看类的全名是否相同,还要看加载此类的类加载器是否一样。只有两者都相同的情况,才认为两个类是相同的。即使两个类来源于同一个class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相同。

7.4. 流程

  1. loadClass(): 这是类加载机制的入口点,当需要加载一个类时,这个方法会被调用。它遵循双亲委派模型,首先检查该类是否已经被当前类加载器加载过(通过查询其内部缓存)。如果没有加载过,loadClass()不会直接去查找类,而是先委托给其父类加载器去尝试加载。
  2. 双亲委派模型: 在loadClass()方法内部,如果父类加载器存在(非Bootstrap ClassLoader,因为它没有父加载器),则递归地调用父加载器的loadClass()方法。这一过程会一直向上委托,直到到达 Bootstrap ClassLoader。如果父加载器无法加载这个类(返回null),那么控制权会逐级返回到原始请求加载的类加载器。
  3. findClass(): 当委派链中的所有类加载器都无法加载这个类时,最终控制流会回到最初请求加载的类加载器,并调用其findClass()方法。这是自定义加载逻辑实现的地方,可以通过覆盖这个方法来从特定来源(如文件系统、数据库、网络等)加载类的二进制数据,并使用defineClass()方法将这些二进制数据转换为JVM可识别的Class对象。
  4. defineClass(): findClass()内部通常会使用defineClass()方法来完成类的定义工作,即将字节码转化为Class对象并加载到Java虚拟机中。此方法可以看作是将二进制数据“定义”为一个Java类型的点,它也是类加载过程中真正创建类的实例的地方。

标签:委派,loadClass,模型,双亲,方法,加载
From: https://blog.csdn.net/qq_62440604/article/details/139292722

相关文章

  • LLM 大模型学习必知必会系列(八):10分钟微调专属于自己的大模型
    LLM大模型学习必知必会系列(八):10分钟微调专属于自己的大模型1.环境安装#设置pip全局镜像(加速下载)pipconfigsetglobal.index-urlhttps://mirrors.aliyun.com/pypi/simple/#安装ms-swiftpipinstall'ms-swift[llm]'-U#环境对齐(通常不需要运行.如果你运行错......
  • 微调真的能让LLM学到新东西吗:引入新知识可能让模型产生更多的幻觉
    大型语言模型(llm)是在巨大的文本语料库上训练的,在那里他们获得了大量的事实知识。这些知识嵌入到它们的参数中,然后可以在需要时使用。这些模型的知识在培训结束时被“具体化”。在预训练结束时,模型实际上停止学习。对模型进行对齐或进行指令调优,让模型学习如何充分利用这些知识,......
  • LLM 大模型学习必知必会系列(九):Agent微调最佳实践,用消费级显卡训练属于自己的Agent!
    LLM大模型学习必知必会系列(九):Agent微调最佳实践,用消费级显卡训练属于自己的Agent!SWIFT支持了开源模型,尤其是中小型模型(7B、14B等)对Agent场景的训练,并将loss-scale技术应用到agent训练中,使中小模型APICall能力更稳定,并支持使用单张商业级显卡进行Agent推理和部署,可以直接在生......
  • 【C++】【YOLO】搭建环境运行YOLO模型,完成目标识别
    1、安装VisualStudio,勾选C++和Python负荷 2、安装CUDA|Pytorch|Python这三者之间的版本关系很重要详情参考:Pycharm搭建CUDA,Pytorch教程(匹配版本,安装,搭建全保姆教程)_cuda12.3对应的pytorch版本-CSDN博客3、下载ultralytics所有代码进行修改(https://github.com/ultralyt......
  • 类加载与双亲委派模型(重点!)
    1.1类的生命周期类在内存中完整的生命周期:加载-->使用-->卸载。其中加载过程又分为:装载、链接、初始化三个阶段1.2 类的加载过程(重点,背也要背下来)当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载、链接、初始化三个步骤来对该类进行初始化。如果没有......
  • Deep Models Under the GAN: Information Leakage from Collaborative Deep Learning
    最近要看一些推理攻击的内容,把看过的都放过来吧DeepModelsUndertheGAN:InformationLeakagefromCollaborativeDeepLearningGAN下的深度模型:协作深度学习的信息泄漏ACMCCS2017文章目录一、论文信息1.题目2.作者3.期刊年限4.关键词二、背景三、创新......
  • MATLAB的多种预测模型函数(上)建议收藏,可直接调用
    初始变量:yt:输入的时间序列数据j:预测的未来步数 线性回归预测法:functionresults=forecast13(~,yt,j)%yt:输入的时间序列数据%j:预测的未来步数%确定输入数据的长度n=length(yt);%将时间序列数据转换为设计矩阵,用于线......
  • bert模型数据集加载方式
    数据集构造无论是机器学习还是深度学习对于数据集的构造都是十分重要。现记录一下PyTorch的torch.utils.data.Dataset类的子类。Dataset类是PyTorch框架中用于处理数据的基本组件,它允许用户定义自己的数据集类,以满足特定任务的需求。Dataset是一个抽象基类,用于创建自......
  • AI模型 YOLOv8在工业中的应用案例
    YOLOv8在工业中的应用案例一、YOLOv8简介YOLOv8(YouOnlyLookOnce,Version8)是YOLO系列的最新版本,以其高效和实时检测的能力在工业领域得到了广泛应用。本文将介绍YOLOv8在几个具体工业应用中的案例,并提供相关的GitHub资源。二、YOLOv8的工业应用案例案例一:自动化生产......
  • AI大模型技术速成:产品经理的转型之路
    作为一名优秀的产品经理,大模型技术简直是我我们工作中的超级助手,它让我们的产品设计和决策变得更加高效和精准。大模型在自然语言处理、数据分析、预测建模等方面的强大能力,使我能够更深入地理解用户需求,从而设计出更符合用户期望的产品。以下是大模型对产品经理的帮助主要......