(JVM)双亲委派机制

news2025/7/18 9:49:51

Java 虚拟机对 class 文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的 class 文件加载到内存生成 class 对象。而且加载某个类的 class 文件时,Java 虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。

工作原理

  • 1)如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;

  • 2)如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;

  • 3)如果父类加载器可以完成类加载任务,就成功返回(就不会由子类加载器去加载了),倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。

image-20200705105151258

举例:

1. 

出于安全考虑,Bootstrap 启动类加载器只加载包名为 java、javax、sun 等开头的类。一看你是java开头的,引导类加载就说了。这是归我管我来加载String(核心API里的String)。因此有父类来加载后,就不会再向下委托了,所以我们new 的这个String对象就是核心API里面的String类对象,而不是我们自定义的String,因此就没有打印出自定义String里的static静态资源里的语句

2. 

委托到引导类加载器,它发现你这个包是jvm开头的,不归引导类加载管,就向下委托,也不归扩展类加载器管,所以最后回到系统类加载器来加载,因此最后输出结果就是系统类加载来进行的加载

3. 

一直往上委托,就交给到了引导类加载器,它加载了String类以后,然后就想去执行main方法,但是核心API的String里面是没有main方法的,所以就报了 错误: 在类 java.lang.String 中找不到 main 方法. 可知,根本就没有试着想去加载我们自定义的String类,完全忽略掉你了

4. 

当我们加载 jdbc.jar 用于实现数据库连接的时候,首先我们需要知道的是 jdbc.jar 是基于 SPI 接口进行实现的,所以在加载的时候,会进行双亲委派,最终从根加载器中加载 SPI 核心类,然后在加载 SPI 接口类,接着在进行反向委派,通过线程上下文类加载器进行实现类 jdbc.jar 的加载。

image-20200705105810107

优势

  • 避免类的重复加载

  • 保护程序安全,防止核心 API 被随意篡改

    • 自定义类:java.lang.String

    • 自定义类:java.lang.ShkStart(报错:阻止创建 java.lang 开头的类) 

栗子:

 分析:引导类加载器看到是 java.lang开头的,就表示这是归它管,于是就要去加载这个ShkStart类了,但直接直接给它报错了,相当于,要加载java.lang这个包,要想访问是要有权限的,现在报错就是阻止我们去直接用这个java.lang包来自定义这个ShkStart类。其实这也是起到了保护作用和出于安全的考虑,如果允许去加载这个类,加载成功的话,就会导致对引导类加载器本身造成影响,所以这里是直接把引导类加载器给整挂了。所以我们也禁止去用java.lang这样的包名去命名

其实这也是起到了保护作用和出于安全的考虑,如果允许去加载这个种自定义的类,加载成功的话,但里面可能会有一些恶意代码,就可能会会对现有的项目和程序进行破坏

沙箱安全机制

自定义 String 类,但是在加载自定义 String 类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载 jdk 自带的文件(rt.jar 包中 java\lang\String.class),报错信息说没有 main 方法,就是因为加载的是 rt.jar 包中的 string 类。这样可以保证对 java 核心源代码的保护,这就是沙箱安全机制。

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

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

相关文章

文档基础模型引领文档智能走向多模态大一统

编者按:自2019年以来,微软亚洲研究院在文档智能领域进行了诸多探索,开发出一系列多模态任务的文档基础模型 (Document Foundation Model),包括 LayoutLM (v1、v2、v3) 、LayoutXLM、MarkupLM 等。这些模型在诸如表单、收据、发票、…

MySQL中find_in_set函数的使用

1.语法 FIND_IN_SET(str,strlist) (1)str 要查询的字符串 (2)strlist 字段名; 参数以”,”分隔 如 (1,2,6,8) 查询字段(strlist)中包含(str)的结果,返回结果为null或记录 假如字符串str在由N个子链组成的…

5G无线技术基础自学系列 | 物理上行控制信道

素材来源:《5G无线网络优化实践》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 PUCCH用于传输上行控制信息(U…

岭回归、Lasso回归和弹性网络

减少过拟合的一个好方法是对模型进行正则化(即约束模型):它拥有的自由度越少,则过拟合数据的难度就越大。正则化多项式模型的一种简单方法是减少多项式的次数。 对于线性模型,正则化通常是通过约束模型的权重来实现的。…

记一次生产中使用CompletableFuture遇到的坑

为什么使用CompletableFuture 业务功能描述:有一个功能是需要调用基础平台接口组装我们需要的数据,在这个功能里面我们要调用多次基础平台的接口,我们的入参是一个id,但是这个id是一个集合。我们都是使用RPC调用,一般…

【22年11月12日更新】搭建宝塔面板、青龙面板“京东代挂”

本文章仅供学习 一、青龙面板是什么? 青龙面板可以运行某东脚本,你在某宝、某度等各个渠道搜索“京东代挂”,都是用青龙面板。 二、搭建宝塔面板 1.更新 yum 包 首先下载finalshell通过账号密码连接服务器,然后输入 yum up…

零基础程序员想要学好.Net,跟着这7个步骤学习就可以了

作为一个初学者程序员,很喜欢问的一个问题就是:零基础如何自学编程?在后台也有很多读者私信我,问我这个问题,其实这个问题比较大,不是一两句就可以说清楚的。 所以,今天结合我个人的经历&#x…

注意力机制详解(Attention详解)

注意力机制与人眼类似,例如我们在火车站看车次信息,我们只关注大屏的车次信息,而忽略大屏外其他内容,从而导致钱包被偷。。。 注意力机制只关注重点信息,忽略不重要的信息,关注最核心的内容。 主要就是这…

推荐系统实战2——EasyRec 推荐框架环境配置

推荐系统实战2——EasyRec 推荐框架环境配置学习前言先验条件EasyRec仓库地址EasyRec环境配置一、EasyRec的下载二、EasyRec的初始化三、EasyRec的安装四、一些额外的情况学习前言 EasyRec是阿里巴巴开源的推荐系统框架。生命苦短,从建好的推荐系统框架开始学&…

【C++】STL简介 -- string 的使用及其模拟实现

文章目录一、STL 简介1、什么是 STL2、STL 的版本3、STL 的六大组件4、STL 的重要性5、如何学习 STL二、string 类的使用1、什么是 string2、string 类模板3、构造函数4、Iterators5、Capacity6、Element Access7、Modify8、String Operations9、Non-member function overloads…

Arduino程序设计(二) 按键控制LED灯

按键控制LED灯程序设计前言一、按键控制LED灯——内部上拉(基础)二、按键控制LED灯——外部上拉(基础)三、按键控制LED灯(进阶)总结参考文献前言 本文主要介绍三种按键控制LED灯的实现方式,分别…

PatchCore原理与代码解读

paper:Towards Total Recall in Industrial Anomaly Detection code:GitHub - amazon-science/patchcore-inspection 存在的问题 目前无监督缺陷检测常用的一种方法是直接利用在ImageNet上预训练的模型中的表示,而不专门进行目标分布的迁…

从零开始将图片信息和空间信息绑定,并在前端展示到地图

作者:xiaoyan 关键词:前端查询时展示和空间数据绑定的图片资源 本文适合零基础入门 背景:iServer支持空间查询,可以将空间数据属性表中的属性查询出来,如通过SQL语句查询出某地大楼实际层高,或者查询出某…

RHCE实验--配置nfs服务

1、开放/nfs/shared目录,供所有用户查询资料; 2、开放/nfs/upload目录,供所有用户上传下载资料; 服务器与客户端都写好yum源以及挂载光盘,然后安装服务包 [rootserver ~]# yum install rpcbind -y [rootserver ~]# y…

Vue3基础

Vue 官网 https://cn.vuejs.org/ https://v3.cn.vuejs.org/ https://staging-cn.vuejs.org/api/ 1、环境 1.1、nodejs node node -vnpm #当前版本 npm -v #升级npm版本 npm install -g npm1.2、vue #安装vue npm install -g vue-cli #安装最新版本 npm install -g vu…

LQ0197 锦标赛【程序填空】

题目来源:蓝桥杯2014初赛 C A组E题 题目描述 本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(C/Java)后进行提交。若题目中给出的源代码语言不唯一&#xff0…

Python简单实现人脸识别检测, 对照片进行评分

大家好,今天和大家说说如何用Python简单实现人脸识别检测, 对照片进行排名,看看自己有多漂亮。 [开发环境]: Python 3.8 Pycharm 2021.2 [模块使用]: requests >>> pip install requeststqdm >>> pip install tqdm 简单实现进度条效果…

Arduino从零开始(1)——按钮控制LED

0.前言 本文主要介绍Arduino对于开关和条件判断函数的使用。 目录 0.前言 1.介绍 2.按钮控制LED 2.1下拉模式: 2.2上拉模式 3.扩展实验: 1.介绍 前篇介绍了点亮LED,这次案例我们尝试通过一个简单的传感器——按钮,来实现…

Ubuntu20.04离线安装Vmware tools

参考连接:在 Linux 虚拟机中手动安装 VMware Tools 从 Workstation Pro 菜单栏中选择虚拟机 > 安装 VMware Tools。 如果安装了早期版本的Vmware tools,则菜单项是更新Vmware tools如果这个安装Vmware tools 是灰色的,进行如下的处理方式…

HTML基本骨架与编辑器选择

HTML基本骨架与编辑器选择 文章目录HTML基本骨架与编辑器选择1.HTML基本了解1.1 什么是HTML1.2 HTML标签1.3 HTML元素1.4 Web浏览器1.5 HTML网页结构1.6 HTML版本了解2.HTML基本骨架介绍3.HTML编辑器的下载与使用1.HTML基本了解 1.1 什么是HTML HTML 是用来描述网页的一种语言…