JVM学习-详解类加载器(二)

news2025/1/19 17:19:42
双亲委派机制

在这里插入图片描述

双亲委派优势
  • 避免类的重复加载,确保一个类的全局唯一性
  • Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层次关系可以避免类的重复加载,当父类已经加载了该类,就没有必要子ClassLoader再加载一次
  • 保护程序安全,防止核心API被随意篡改
代码支持
  • 双亲委派机制在java.lang.ClassLoader.loadClass(String,boolean)接口中体现
  • ①先在当前加载器的缓存中查找有无目标类,如果有,直接返回
  • ②判断当前类加载器的父类加载器是否为空,如果不为空,调用parent.loadClass(name,false)接口进行加载
  • ③反之,如果当前加载器的父类加载器为空,则调用findBootstrapClassOrNull(name)接口,让引导类加载器进行加载
  • ④如果以上3条都没成功,则调用findClass(name)接口进行加载,该接口最终会调用java.lang.ClassLoader类的defineClass系列native方法加载目标Java类
  • 双亲委派模型隐藏在第2和3步中
思考
  • 如果在自定义的类加载器中重写java.lang.ClassLoader.loadClass(String)或java.lang.ClassLoader.loadClass(String,boolean)方法,抹去双亲委派机制,仅保留上面第1和4步,那是否就可以使用自定义类加载器加载核心类库
  • 不行,因为JDK还为核心类库提供了一层保护机制,不管是自定义类加载器,还是系统类加载器或扩展类加载器,最终都必须调用java.lang.ClassLoader.defineClass(String,byte[],int,int,ProtectionDomain)方法,此方法会执行preDefineClass()方法,该方法提供了对JDK核心类库的保护
双亲委派模式的弊端
  • 检查类是否加载的委托过程是单向的,虽然结构上清晰,使各个ClassLoader的职责非常明确,但会带来一个问题,即顶层的ClassLoader无法访问底层ClassLoader所加载的类
  • 通常情况下,启动类加载器的类为系统核心类,包括一些重要的系统方法,而在应用类加载器中,为应用类,按照这种模式,应用类访问系统类没有问题,但系统类访问应用类就会出现问题,如在系统类中提供一个接口,该接口需要在应用类中实现,该接口还绑定一个工厂方法,用于创建该接口的实例,而接口与工厂方法在启动类加载器中,此时会出现工厂方法无法创建由应用类加载器加载的应用实例的问题
结论
  • 由于Java虚拟机规范并没有明确要求类加载器的加载机制一定要使用双亲委派模型,只是建议采用
  • 在Tomcat中,类加载器采用的加载机制和传统双亲委派模型有一定区别,当缺省的类加载器接收到一个类加载任务时,首先由它自行加载,当加载失败,才会将类的加载任务委派给它的超类加载器去执行,这同时也是Servlet规范推荐的一种做法
沙箱安全机制
  • 保证程序安全
  • 保证Java原生的JDK代码
  • 沙箱是一个限制程序运行的环境
  • 沙箱机制是将Java代码限定在虚拟机(JVM)特定的运行范围中,并且严格限制代码对本地系统资源访问,通过这样的措施来保证对代码的有限隔离,防止对本地系统造成破坏
  • 沙箱主要限制系统资源访问,CPU,内存,文件系统,网络
  • 所有的Java程序都可以指定沙箱,可以定制安全策略
  • JDK1.0时期:
    在这里插入图片描述

  • JDK1.1时期:针对安全机制做了改进,增加了安全策略,允许用户指定代码对本地资源的访问权限
    在这里插入图片描述

  • JDK1.2时期
    在这里插入图片描述

  • JDK1.6时期

  • 当前最新的安全机制实现,引入域的概念
  • 虚拟机会把所有代码加载到不同的系统域和应用域,系统域部分专门负责与关键资源进行交互,而各个应用域部分则通过系统域的部分代理来对各种需要的资源进行访问。虚拟机不同的受保护域(Protected Domain),对应不一样的权限(Permission),存在于不同域中的类文件就具有了当前域的全部权限
    在这里插入图片描述

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

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

相关文章

ai辅助教育孩子

孩子经常躺在床上看手机是一个需要关注的问题,因为这不仅可能影响他们的视力健康,还可能影响睡眠质量和身体健康。以下是一些建议,帮助应对这一问题: 设定明确的规定: 与孩子一起制定使用手机的规则,如每天…

nginx c++模块编译

不论是c还是c,nginx的第三方模块编写没什么太区别,但是提供给nginx调用的,必须是纯c的接口。 先说下为什么不能使用c编译nginx,nginx是纯c写的,而且c是兼容c的,但是用c(g)编译nginx的框架,就会出…

呆滞物料规范管理了,问题就好办了

对于制造企业来说,库存是生存和发展的重要保障,过高的库存会占用企业大量的资金和管理成本,影响企业的正常生产,然而多数中小制造企业还在用人工干预管理,如何控制呆滞物料成为仓储管理的一大难题。 什么是呆滞料&…

【JAVASE】日期与时间类(下)

三:LocalDateTime 相当于LocalDate类,在LocalDateTime类的对象中还可以封装时、分、秒和纳秒(1纳秒是1秒的十亿分之一)等时间类型。 例如,创建LocalDateTime对象 , LocalDateTime date LocalDateTi…

【Docker】上海交通大学开源镜像站服务变更:Docker 用户需迅速行动

近日,上海交通大学开源镜像站宣布了一个重大变更,对国内Docker用户来说,这一消息无疑具有紧迫性。 镜像站服务的变更 上海交通大学开源镜像站一直是国内Docker用户的重要资源,它提供了快速下载DockerHub仓库镜像的服务。然而&a…

LiDAR360MLS 7.2.0 雷达点云数据处理软件功能介绍

新增模块和功能: 支持手持、背包数据的解算 SLAM解算成功率提升 SLAM解算效率提升 采集端与后处理端保持一致 赋色优化 新增平面图模块 新增平面图全自动矢量化功能 新增平面图矢量一键导出DXF功能 新增平面图正射影像一键导出功能 支持交叉、垂直绘制 支…

如何安装 CleanMyMac X 4.15.3破解版

CleanMyMac X 4.15.3破解版是一款专业的Mac系统清理软件,可一键智能扫描清理mac系统日志缓存磁盘垃圾和多余语言安装包,快速释放电脑内存,轻松管理和升级Mac上的应用。同时CleanMyMac X 破解版可以强力卸载恶意软件,修复系统漏洞&…

数据挖掘--聚类分析:基本概念和方法

数据挖掘--引论 数据挖掘--认识数据 数据挖掘--数据预处理 数据挖掘--数据仓库与联机分析处理 数据挖掘--挖掘频繁模式、关联和相关性:基本概念和方法 数据挖掘--分类 数据挖掘--聚类分析:基本概念和方法 聚类分析 聚类分析是把一个数据对象&…

Java基础——数组Array

系列文章目录 文章目录 系列文章目录前言一、数组基本概念二、一维数组三、数组的模型四、数组对象的创建五、元素为引用数据类型的数组 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网…

基于协同注意力的视觉-语言嵌入用于机器人手术视觉问题定位回答

文章目录 CAT-ViL: Co-attention Gated Vision-Language Embedding for Visual Question Localized-Answering in Robotic Surgery摘要方法实验结果 CAT-ViL: Co-attention Gated Vision-Language Embedding for Visual Question Localized-Answering in Robotic Surgery 摘要…

如何搭建跨境电商独立站||搭建跨境电商独立站必须具备的功能板块设计

在搭建跨境电商独立站时,需要确保网站具备一系列关键的功能板块,以提供用户友好的购物体验并确保业务的顺利进行。以下是这些功能板块的详细归纳: 注册登录与身份验证: 用户注册与登录:允许用户创建账户,通…

探索C++ STL中的std::list:链式存储的艺术与实践

目录 ​编辑 引言 一、std::list详解 二、std::list的关键成员函数 三、示例代码 四、std::list与std::vector的对比 内存布局: 插入与删除: 迭代器稳定性: 五、应用场景 结语 引言 在C标准模板库(STL)中,std::list作…

redis学习路线

待更新… 一、nosql讲解 1. 为什么要用nosql? 用户的个人信息,社交网络,地理位置,自己产生的数据,日志等等爆发式增长!传统的关系型数据库已无法满足这些数据处理的要求,这时我们就需要使用N…

python-自幂数判断

[题目描述]: 自幂数是指,一个N 位数,满足各位数字N 次方之和是本身。例如,153153 是 33 位数,其每位数的 33 次方之和,135333153135333153,因此 153153 是自幂数;16341634 是 44 位数…

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(一)

概览 在任何语言中对序列(或集合)元素的排序无疑是一种司空见惯的常规操作,在 Swift 语言里自然也不例外。序列排序看似简单,实则“暗藏玄机”。 要想真正掌握 Swift 语言中对排序的“各种姿势”,我们还得从长计议。不如就先从最简单的排序基本功开始聊起吧。 在本篇博…

OpenCv之简单的人脸识别项目(动态处理页面)

人脸识别 准备九、动态处理页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.定义视频处理脚本4.定义相机抓取脚本5.定义关闭窗口的函数6.按钮设计6.1视频处理按钮6.2相机抓取按钮6.3返回按钮 7.定义关键函数8.动态处理…

Halcon 双相机标定与拼图(二)

一、概述 这种标定有两种模式,有一个标定板和多个标定板两种 一个标定板 两个相机的重叠区域比较大,那么我们可以把标定板放到那个重叠区域来统一坐标系,如下 这种是只需要一个标定板,这种是推荐的方式 。这种是比较简单的&…

Unity DOTS技术(十四) Job与ParallelJob接口

文章目录 一.创建方式如下图:二.开启Burst编译器三.创建多个Job四.数学运算介绍五.ParallelJob接口1.传统方式创建2.使用Parallel来实现对比3开启Burst编译器对比 这里介绍直接使用Job新的开启线程工作的方式. 一.创建方式如下图: 这里就开启了一个线程 二.开启Burst编译器 …

【机器学习】Softmax回归探索

从零开始探索Softmax回归:深度学习的入门之旅 一、Softmax回归的原理与关键步骤二、研究准备:GPU环境下的PyTorch安装与配置三、研究内容:使用PyTorch实现Softmax回归 随着人工智能和机器学习的迅猛发展,深度学习技术逐渐成为了科…