双亲委派(JVM)
1.双亲委派
在 Java 中,双薪委派通常是指双亲委派模型,它是 Java 类加载器的一种工作模式,用于确保类加载的安全性和一致性。以下是其相关介绍:
定义与作用
- 定义:双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。当一个类加载器收到类加载请求时,它首先不会自己去尝试加载这个类,而是把请求委派给父类加载器去完成,每一层的类加载器都是如此,直到顶层的启动类加载器。如果父类加载器无法完成加载任务,子类加载器才会尝试自己去加载。
- 作用:这种模型可以避免类的重复加载,保证 Java 程序的稳定运行。不同的类加载器负责加载不同范围的类,通过这种层级关系,可以确保类的唯一性和安全性。
实现原理
在 Java 中,类加载器是通过ClassLoader
类及其子类来实现的。ClassLoader
类中有一个loadClass()
方法,它是实现双亲委派模型的关键。以下是简化的代码示例:
public class ClassLoader {// 父类加载器private ClassLoader parent;public Class<?> loadClass(String name) throws ClassNotFoundException {// 首先检查是否已经加载过该类Class<?> c = findLoadedClass(name);if (c == null) {try {// 如果父类加载器不为空,委托父类加载器加载if (parent!= null) {c = parent.loadClass(name);} else {// 如果父类加载器为空,说明已经到了顶层的启动类加载器c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// 父类加载器无法加载,自己尝试加载c = findClass(name);}}return c;}protected Class<?> findClass(String name) throws ClassNotFoundException {// 自定义的类加载逻辑,由具体的类加载器实现throw new ClassNotFoundException(name);}protected final Class<?> findLoadedClass(String name) {// 查找已经加载的类,由具体的类加载器实现return null;}private Class<?> findBootstrapClassOrNull(String name) {// 查找启动类加载器加载的类,由具体的类加载器实现return null;}
}
应用场景
- 系统类的加载:Java 核心类库中的类,如
java.lang.Object
、java.util.Date
等,都是由启动类加载器或其他系统类加载器按照双亲委派模型进行加载的。这确保了这些核心类的唯一性和安全性,避免了用户自定义的同名类对系统类的干扰。 - 插件化框架:在一些插件化框架中,需要隔离不同插件之间的类加载,以防止类的冲突和混乱。通过使用自定义的类加载器,并遵循双亲委派模型,可以实现插件之间的类加载隔离,每个插件都有自己独立的类加载空间。
- 安全控制:双亲委派模型可以防止恶意代码伪装成系统类来执行,因为系统类是由受信任的系统类加载器加载的。如果有恶意代码想要替换系统类,由于双亲委派模型的限制,它无法绕过系统类加载器来加载自己定义的类,从而提高了系统的安全性。
2.双亲委派模型的优势和劣势是什么?
优势
- 避免类的重复加载:双亲委派模型要求类加载器在收到类加载请求时,先将请求委派给父类加载器。只有当父类加载器无法完成加载任务时,子类加载器才会尝试自己加载。这样可以确保一个类只会被加载一次,避免了类的重复加载,节省了系统资源,提高了类加载的效率。
- 保证类的安全性:在双亲委派模型中,Java 核心类库中的类(如
java.lang.Object
等)是由启动类加载器或其他系统类加载器加载的。这些类加载器是受信任的,它们只会加载被认可的系统类。由于系统类加载器的层级较高,用户自定义的类加载器无法绕过它们来加载同名的系统类,从而防止了恶意代码伪装成系统类来执行,保证了系统的安全性。 - 提高类加载的稳定性:双亲委派模型通过明确的类加载器层级关系,使得类的加载过程更加有序。不同的类加载器负责加载不同范围的类,这种分工明确的方式有助于提高整个类加载过程的稳定性,减少因类加载混乱而导致的程序错误。
- 便于类的管理和维护:由于类加载是按照一定的层级关系进行的,所以对于类的管理和维护更加方便。可以通过控制类加载器的层级和加载范围,来实现对类的访问控制和管理。
劣势
- 灵活性受限:双亲委派模型的类加载顺序是固定的,这种固定的加载顺序在某些情况下可能会限制应用的灵活性。例如,在一些特殊的应用场景中,可能需要打破双亲委派模型的常规加载顺序,按照自定义的方式来加载类,但双亲委派模型使得这种自定义加载变得困难。
- 无法解决所有类加载问题:虽然双亲委派模型能够解决大多数类加载的安全性和一致性问题,但对于一些复杂的类加载场景,它可能无法完全满足需求。例如,在一些分布式系统或动态加载的应用中,可能需要更灵活的类加载机制来处理不同节点之间的类加载和版本兼容性问题。
- 类加载过程复杂:双亲委派模型的类加载过程涉及多个类加载器之间的交互和委派,使得类加载过程相对复杂。这可能会增加应用开发和调试的难度,特别是在出现类加载错误时,定位和解决问题可能会比较困难。
相关文章:
双亲委派(JVM)
1.双亲委派 在 Java 中,双薪委派通常是指双亲委派模型,它是 Java 类加载器的一种工作模式,用于确保类加载的安全性和一致性。以下是其相关介绍: 定义与作用 定义:双亲委派模型要求除了顶层的启动类加载器外…...
第二十一章:考研的艰难抉择与放弃入学的转折
深秋时节,校园宛如被大自然精心雕琢的艺术殿堂。金黄的银杏叶在阳光的轻抚下,闪烁着细碎的光芒,微风拂过,叶片相互摩挲,发出沙沙的轻响,仿佛在低声诉说着岁月的故事。一片片银杏叶悠悠然飘落,宛…...
webpack配置之---output.chunkLoading
output.chunkLoading webpack.output.chunkLoading 配置项用于指定 Webpack 如何加载异步 chunk(即按需加载的代码块)。在现代 Webpack 版本中,异步代码分割成为了非常常见的功能,chunkLoading 配置项就用于控制 Webpack 加载这些…...
升级RAG应用程序与Redis向量库
Redis Vector Library (RedisVL) 简化AI应用开发 几个月前,Redis推出了Redis向量库(RedisVL),以简化人工智能(AI)应用的开发。自那时起,我们引入了强大的新功能,支持大规模的语言模…...
【starrocks学习】之将starrocks表同步到hive
目录 方法 1:通过HDFS导出数据 1. 将StarRocks表数据导出到HDFS 2. 在Hive中创建外部表 3. 验证数据 方法 2:使用Apache Spark同步 1. 添加StarRocks和Hive的依赖 2. 使用Spark读取StarRocks数据并写入Hive 3. 验证数据 方法 3:通过…...

HTML应用指南:利用GET请求获取全国盒马门店位置信息
随着新零售业态的发展,门店位置信息的获取变得至关重要。作为新零售领域的先锋,盒马鲜生不仅在商业模式创新上持续领先,还积极构建广泛的门店网络,以支持其不断增长的用户群体。本篇文章,我们将继续探究GET请求的实际应用,我们使用Python的requests库通过GET请求,从盒马…...
openEuler部署 sysstat工具
查看环境 [rootlocalhost lxm]# cat /etc/os-release NAME"openEuler" VERSION"23.09" ID"openEuler" VERSION_ID"23.09" PRETTY_NAME"openEuler 23.09" ANSI_COLOR"0;31"查看 yum 源 [rootlocalhost lxm]# he…...
使用 Three.js 实现炫酷的除夕烟花特效
1,前言 在除夕夜,璀璨的烟花点亮夜空,为节日增添了浓厚的喜庆氛围。在 Web 端,我们可以使用 Three.js 来模拟这种美轮美奂的烟花特效,让网页也能展现绚丽的节日气息。本文将介绍如何利用 Three.js 及其着色器技术&…...

LMM-3DP:集成 LMM 规划器和 3D 技能策略实现可泛化操作
25年1月来自UCSD的论文“Integrating LMM Planners and 3D Skill Policies for Generalizable Manipulation”。 大型多模态模型 (LMM) 的视觉推理能力和 3D 特征场语义丰富性的最新进展,拓展了机器人能力的范围。这些发展对于弥合 LMM 高级推理与利用 3D 特征场低…...

Linux——基础命令3
1、关机重启命令 reboot指令 作用:重启计算机 语法:reboot shutdown指令 作用:关机 语法:shutdown -h 时间 时间常见的值: now (立即关机) m(m表示minutes数字)eg&…...

ChatGPT提问技巧:行业热门应用提示词案例-文案写作
ChatGPT 作为强大的 AI 语言模型,已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案,关键在于如何与它“沟通”,也就是如何设计提示词(Prompt)。以下是一些实用的提示词案例,帮助你解锁 ChatG…...
python - 封装moondream(备份)
目录 一、 moondream封装成类 二、moondream封装成http api 一、 moondream封装成类 # moondream_model.py #https://github.com/vikhyat/moondream?tab=readme-ov-fileimport moondream as md from PIL import Imageclass MoondreamModel:def __init__(self, model_path):…...

响应式编程库(三) -r2dbc
r2dbc整合 什么是r2dbc版本选择简单试用整合springbootDatabaseClient 进行查询使用Repository接口(对应mapper)实体类复杂查询(一对一)实体类转换器测试代码一对多关系 什么是r2dbc 反应式关系数据库连接(R2DBC)项目为关系数据库…...
嵌入式AI革命:DeepSeek开源如何终结GPU霸权,开启单片机智能新时代?
2025年,全球AI领域最震撼的突破并非来自算力堆叠的超级模型,而是中国团队DeepSeek通过开源策略,推动大模型向微型化、低功耗场景的跨越。相对于当人们还在讨论千亿参数模型的训练成本被压缩到600万美金而言,被称作“核弹级别”的操…...

基于遗传算法的64QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率
目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): GA优化过程: 优化前后星座图对比: (优化后…...

从零开始玩转Docker:轻松开启容器化之旅
一、什么是 Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。简单来说,Docker 就像是一个超级 “快递箱”,…...

kafka生产端之架构及工作原理
文章目录 整体架构元数据更新 整体架构 消息在真正发往Kafka之前,有可能需要经历拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)等一系列的作用,那么在此之后又会…...

38、【OS】【Nuttx】OSTest分析(3):参数传递
背景 接之前 blog 36、【OS】【Nuttx】OSTest分析(2):环境变量测试 37、【OS】【Nuttx】OSTest分析(2):任务创建 分析完环境变量测试,和任务创建的一些关键要素,OSTest 进入下一阶段…...

存储异常导致的Oracle重大生产故障
📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...
C语言时间相关宏定义
在C语言中,预处理器提供了一些与时间相关的宏定义,用于在编译时获取日期、时间等信息。除了 __TIMESTAMP__ 和 __DATE__,还有以下相关的宏定义: __DATE__ 当前编译日期的字符串,格式为 "Mmm dd yyyy"&#x…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...