当前位置: 首页 > article >正文

JVM双亲委派机制详解

双亲委派机制:

由于Java虚拟机中有多个类加载器,双亲委派机制的核心是解决一个类到底由谁加载的问题。

双亲委派机制有什么用?

  1. 保证类加载的安全性
  1. 避免重复加载

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

  • 向上查找如果已经加载过,就直接返回Class对象,加载过程结束。这样能避免一个类重复加载。
  • 如果所有的父类加载器都无法加载该类,则由当前类加载器自己尝试加载。所有看上去是自顶向下尝试加载。
  • 第二次在去加载相同的类,仍然会向上进行委派,如果某个类加载器加载过就会直接返回。

向下委派加载起到了一个加载优先级的作用。

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

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

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

        答:不会,他还是会从启动类加载器进行加载

                进行代码的验证如下:输出string类的时候为null,正是因为在java代码中是不可以获取到类加载器的信息的

  • 每个Java实现的类加载器中保存了一个成员变量叫“父”类加载器,可以理解为他的上级,并不是继承关系

  • 扩展类加载器在java代码中的parent是null,也正是因为启动类加载器在java代码中是不可以获得的。但是在代码逻辑上,扩展类加载器依然会把启动类加载器当作父类加载器处理。
  • 启动类加载器使用的是C++编写的,没有父类加载器。

类加载器中的父子关系可以通过classloader -t 查看:(在图片中将扩展类加载器和启动类加载器在同一级 也正是因为扩展类加载器的parent为null)

system.in.read( )可以防止方法运行结束。

类的双亲委派的机制到底是什么?

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

打破双亲委派机制:

打破双亲委派的三种方式:
  • 自定义类加载器
    • 自定义类加载器并且重写loadClass方法,就可以将双亲委派机制的代码去除
    • Tomcat通过这种方式实现应之间类的隔离
  • 线程上下文类加载器
    • 利用上下文类加载器加载类,比如JDBC和JNDI等
  • Osgi框架的类加载器
    • 历史上Osgi框架实现了一套新的类加载器机制,允许同级之间委托进行类的加载

http://www.kler.cn/a/398130.html

相关文章:

  • 论文笔记 SuDORMRF:EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION
  • GitLab 如何降级?
  • 【模板】字典树luoguP8306
  • Python常用魔术方法 (学习笔记)
  • 向潜在安全信息和事件管理 SIEM 提供商提出的六个问题
  • ThriveX 博客管理系统前后端项目部署教程
  • GPT-5 要来了:抢先了解其创新突破
  • web与网络编程
  • scoop安装ffmpeg转换视频为语音文件
  • 前端Javascript、Vue、CSS等场景面试题目(二)
  • 7.2 图像复原之空间滤波
  • Docker 组添加用户,设置允许普通用户操作 docker
  • 如何用润乾发明的DQL查询语法来简化多表关联查询
  • 类和对象——拷贝构造函数,赋值运算符重载(C++)
  • Vue 3 中的原生事件监听与组件事件处理详解
  • Rust字符串类型全解析
  • 使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量
  • 嵌入式linux系统中ADC控制与实现
  • HTTP基础
  • java中volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗?
  • 未来的车网互动如何重塑我们的城市生活
  • 【Linux】Linux系统性能调优技巧
  • 2024强化学习的结构化剪枝模型RL-Pruner原理及实践
  • Qt滑动条美化自定义
  • python语言基础-4 常用模块-4.9 wordcloud模块
  • 分布式事务seata基于docker安装和项目集成seata