双亲委派(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.Objectjava.util.Date等,都是由启动类加载器或其他系统类加载器按照双亲委派模型进行加载的。这确保了这些核心类的唯一性和安全性,避免了用户自定义的同名类对系统类的干扰。
  • 插件化框架:在一些插件化框架中,需要隔离不同插件之间的类加载,以防止类的冲突和混乱。通过使用自定义的类加载器,并遵循双亲委派模型,可以实现插件之间的类加载隔离,每个插件都有自己独立的类加载空间。
  • 安全控制:双亲委派模型可以防止恶意代码伪装成系统类来执行,因为系统类是由受信任的系统类加载器加载的。如果有恶意代码想要替换系统类,由于双亲委派模型的限制,它无法绕过系统类加载器来加载自己定义的类,从而提高了系统的安全性。

2.双亲委派模型的优势和劣势是什么?

优势

  • 避免类的重复加载:双亲委派模型要求类加载器在收到类加载请求时,先将请求委派给父类加载器。只有当父类加载器无法完成加载任务时,子类加载器才会尝试自己加载。这样可以确保一个类只会被加载一次,避免了类的重复加载,节省了系统资源,提高了类加载的效率。
  • 保证类的安全性:在双亲委派模型中,Java 核心类库中的类(如java.lang.Object等)是由启动类加载器或其他系统类加载器加载的。这些类加载器是受信任的,它们只会加载被认可的系统类。由于系统类加载器的层级较高,用户自定义的类加载器无法绕过它们来加载同名的系统类,从而防止了恶意代码伪装成系统类来执行,保证了系统的安全性。
  • 提高类加载的稳定性:双亲委派模型通过明确的类加载器层级关系,使得类的加载过程更加有序。不同的类加载器负责加载不同范围的类,这种分工明确的方式有助于提高整个类加载过程的稳定性,减少因类加载混乱而导致的程序错误。
  • 便于类的管理和维护:由于类加载是按照一定的层级关系进行的,所以对于类的管理和维护更加方便。可以通过控制类加载器的层级和加载范围,来实现对类的访问控制和管理。

劣势

  • 灵活性受限:双亲委派模型的类加载顺序是固定的,这种固定的加载顺序在某些情况下可能会限制应用的灵活性。例如,在一些特殊的应用场景中,可能需要打破双亲委派模型的常规加载顺序,按照自定义的方式来加载类,但双亲委派模型使得这种自定义加载变得困难。
  • 无法解决所有类加载问题:虽然双亲委派模型能够解决大多数类加载的安全性和一致性问题,但对于一些复杂的类加载场景,它可能无法完全满足需求。例如,在一些分布式系统或动态加载的应用中,可能需要更灵活的类加载机制来处理不同节点之间的类加载和版本兼容性问题。
  • 类加载过程复杂:双亲委派模型的类加载过程涉及多个类加载器之间的交互和委派,使得类加载过程相对复杂。这可能会增加应用开发和调试的难度,特别是在出现类加载错误时,定位和解决问题可能会比较困难。

 

 

 

 

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

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

相关文章

数据结构:队列篇

图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 文章目录 系列文章目录前言一.队列的概念和结构1.1概念一、动态内存管理优势二、操作效率与安全性…

Python的那些事第十二篇:从入门到“不撞南墙不回头”Python 文件操作与异常处理

Python 文件操作与异常处理&#xff1a;从入门到“不撞南墙不回头” 目录 Python 文件操作与异常处理&#xff1a;从入门到“不撞南墙不回头” 一、引言 二、Python 文件操作 三、Python 异常处理 四、综合实例&#xff1a;学生成绩管理系统 五、总结与展望 一、引言 1.…

论文解读:《基于TinyML毫米波雷达的座舱检测、定位与分类》

摘要 本文提出了一种实时的座舱检测、定位和分类解决方案&#xff0c;采用毫米波&#xff08;mmWave&#xff09;雷达系统芯片&#xff08;SoC&#xff09;&#xff0c;CapterahCAL60S344-AE&#xff0c;支持微型机器学习&#xff08;TinyML&#xff09;。提出了波束距离-多普勒…

【B站保姆级视频教程:Jetson配置YOLOv11环境(七)Ultralytics YOLOv11配置】

Jetson配置YOLOv11环境&#xff08;7&#xff09;Ultralytics YOLOv11环境配置 文章目录 1. 下载YOLOv11 github项目2. 安装ultralytics包3. 验证ultralytics安装3.1 下载yolo11n.pt权重文件3.2 推理 1. 下载YOLOv11 github项目 创建一个目录&#xff0c;用于存放YOLOv11的项目…

代码讲解系列-CV(二)——卷积神经网络

文章目录 一、系列大纲二、卷积神经网络&#xff08;图像分类为例&#xff09;2.1 pytorch简介训练框架张量自动微分动态计算图更深入学习 2.2 数据输入和增强Dataset—— torch.utils.data.DatasetDataLoader——torch.utils.data.Dataloader数据增强 2.3 CNN设计与训练nn.Mod…

YK人工智能(六)——万字长文学会基于Torch模型网络可视化

1. 可视化网络结构 随着深度神经网络做的的发展&#xff0c;网络的结构越来越复杂&#xff0c;我们也很难确定每一层的输入结构&#xff0c;输出结构以及参数等信息&#xff0c;这样导致我们很难在短时间内完成debug。因此掌握一个可以用来可视化网络结构的工具是十分有必要的…

堆的基本概念

1.1 堆的基本概念 虚拟机所在目录 E:\ctf\pwn-self 进入虚拟机的pwndocker环境 holyeyesubuntu:~$ pwd /home/holyeyes holyeyesubuntu:~$ sudo ./1run.sh IDA分析 int __fastcall main(int argc, const char **argv, const char **envp) { void *v4; // [rsp20h] [rbp-1…

RabbitMQ深度探索:前置知识

消息中间件&#xff1a; 消息中间件基于队列模式实现异步 / 同步传输数据作用&#xff1a;可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点&#xff1a; HTTP 请求基于响应的模型&#xff0c;在高并发的情况下&#xff0c;客户端发送大量的请求…

JDK9新特性

文章目录 新特性&#xff1a;1.模块化系统使用模块化module-info.java&#xff1a;exports&#xff1a;opens&#xff1a;requires&#xff1a;provides&#xff1a;uses&#xff1a; 2.JShell启动Jshell执行计算定义变量定义方法定义类帮助命令查看定义的变量&#xff1a;/var…

合宙air001使用命令行烧写固件

起因&#xff1a; 做了个小板子给同事使用&#xff0c;但同事没有air001的arduino编译烧录环境&#xff0c;安装的话&#xff0c;对于没有接触过arduino的人有些复杂&#xff0c;所以想着能不能直接烧录编译好的固件&#xff1b; 经过&#xff1a; 在网上搜索相关教程&#…

manimgl安装

一、环境 笔记本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy二、安装miniconda3 manimgl基于python开发&#xff0c;为了防止将笔记本中已有的python环境破坏&#xff0c;因此…

Python aiortc API

本研究的主要目的是基于Python aiortc api实现抓取本地设备&#xff08;摄像机、麦克风&#xff09;媒体流实现Web端预览。本文章仅仅描述实现思路&#xff0c;索要源码请私信我。 demo-server解耦 原始代码解析 http服务器端 import argparse import asyncio import json…

编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama

随着开源 LLM 的发展&#xff0c;越来越多的模型变得专业化&#xff0c;“代码”LLM 变得非常流行。这些 LLM 旨在比其 “常识” 对应物更小&#xff0c;但旨在超越更大的通用模型的编码性能。 这些模型以极低的成本提供大型模型的功能&#xff0c;进一步使本地 LLM 空间民主化…

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek&#xff1a;全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权&#xff1a;从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…

SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言

目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件&#xff1a; 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL&#xff08;Data Definition Language&#xff09;&#xff1a;数据定义语言 1、操…

HTB:EscapeTwo[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…

一文讲解Java中的ArrayList和LinkedList

ArrayList和LinkedList有什么区别&#xff1f; ArrayList 是基于数组实现的&#xff0c;LinkedList 是基于链表实现的。 二者用途有什么不同&#xff1f; 多数情况下&#xff0c;ArrayList更利于查找&#xff0c;LinkedList更利于增删 由于 ArrayList 是基于数组实现的&#…

多无人机--强化学习

这个是我对于我的大创项目的构思&#xff0c;随着时间逐渐更新 项目概要 我们的项目平台来自挑战杯揭绑挂帅的无人机对抗项目&#xff0c;但是在由于时间原因&#xff0c;并未考虑强化学习&#xff0c;所以现在通过大创项目来弥补遗憾 我们项目分为三部分&#xff0c;分为虚…

龙芯+FreeRTOS+LVGL实战笔记(新)——16数码管驱动

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了完善与优化,各位可以前往本人在B站的视频合集(图1所示)观看所有演示视频,合集首个视频链接为: https://www.bilibili.…

Day36-【13003】短文,数组的行主序方式,矩阵的压缩存储,对称、三角、稀疏矩阵和三元组线性表,广义表求长度、深度、表头、表尾等

文章目录 本次课程内容第四章 数组、广义表和串第一节 数组及广义表数组的基本操作数组的顺序存储方式-借用矩阵行列式概念二维数组C语言对应的函数-通常行主序方式 矩阵的压缩存储对称矩阵和三角矩阵压缩存储后&#xff0c;采用不同的映射函数稀疏矩阵-可以构成三元组线性表三…