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

双亲委派机制

在这里插入图片描述

双亲委派优势
  • 避免类的重复加载,确保一个类的全局唯一性
  • 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.mzph.cn/pingmian/24539.shtml

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

相关文章

无锡哲讯:引领半导体企业ERP革新,打造行业数字化先锋

在半导体行业,随着技术的不断进步和市场需求的日益增长,企业面临着激烈的竞争和复杂的管理挑战。ERP系统作为现代企业管理的核心工具,对于半导体企业而言,其作用不容小觑。无锡哲讯智能科技有限公司,凭借其在SAP ERP领…

图像编解码器在AI绘画中的革新作用

随着人工智能技术的飞速发展,AI绘画已经从一个简单的概念演变为一个充满创意与可能性的领域。在这场技术与艺术的融合中,图像编解码器扮演着至关重要的角色。它们不仅提升了AI绘画的质量和效率,还拓宽了艺术创造的边界。本篇博客将深入探讨图…

数据结构(树)

数据结构(树) 度:每一个节点的子节点数量 二叉查找树: 每一个节点上最多有两个子节点; 任意节点左子树上的值都小于当前节点; 任意节点右子树上的值都大于当前节点。 添加节点规则: 小的存左边&…

Unity与前端交互:深度解析与实战指南

Unity与前端交互:深度解析与实战指南 在现代游戏开发和跨平台应用中,Unity作为一款强大的游戏引擎,其与前端技术的交互能力显得尤为重要。本文将从四个方面、五个方面、六个方面和七个方面深入探讨Unity如何与前端进行交互,揭示其…

Postman 连接数据库 利用node+xmysql

1、准备nodejs环境 如果没有安装,在网上找教程,安装好后,在控制台输入命令查看版本,如下就成功了 2、安装xmysql 在控制台输入 npm install -g xmysql 3、连接目标数据库 帮助如下: 示例: 目标数据库…

UI前端交互的艺术:探索设计的四个维度、五个层面、六个要点与七大原则

UI前端交互的艺术:探索设计的四个维度、五个层面、六个要点与七大原则 在数字时代的浪潮中,UI前端交互设计如同一门深邃的艺术,既需要技术支撑,又需要设计灵感。它关乎用户体验,影响着产品的成败。那么,UI…

操作系统:进程的状态

进程三种的状态是什么? 运行:进程占有处理器正在运行的状态。进程已获得CPU,其程序正在执行。 就绪:进程具备运行条件,等待系统分配处理器以便运行的状态。当进程已分配到除CPU以外的所有必要资源后,只要…

HTML静态网页成品作业(HTML+CSS)—— 美食湘菜介绍网页(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…

企业估值的三种方法

估值模型三剑客—DCF、P/E、EV /EBITDA 三种主要估值模型的优缺点: DCF 优点:通过对自由现金流的折现计算,反映了公司内在价值的本质,是最重要与最合理的估值方法。 缺点:未来自由现金流的估计不准确,受折现率影响…

MASA:匹配一切、分割一切、跟踪一切

摘要 https://matchinganything.github.io/ 在复杂场景中跨视频帧稳健地关联相同对象是许多应用的关键,特别是多目标跟踪(MOT)。当前方法主要依赖于标注的特定领域视频数据集,这限制了学习到的相似度嵌入的跨域泛化能力。我们提…

企业应如何选择安全合规的内外网文件摆渡系统?

网络隔离是一种安全措施,旨在将网络划分为不同的部分,以减少安全风险并保护敏感信息。常见的隔离方式像物理隔离、逻辑隔离、防火墙隔离、虚拟隔离、DMZ区隔离等,将网络隔离成内网和外网。内外网文件摆渡通常指在内部网络(内网&am…

Llama模型家族之拒绝抽样(Rejection Sampling)(五)蒙特卡罗算法在拒绝抽样中:均匀分布与样本接受标准

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

weditor安装时提示This is an issue with the package mentioned above, not pip

报错如下: note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed Encountered error while generating package metadata. ╰─> See above for output. note: This is an issue with …

kerberos: Clock skew too great (37) - PROCESS_TGS

kerberos认证失败错误信息: Caused by: org.ietf.jgss.GSSException: No valid credentials provided (Mechanism level: Clock skew too great (37) - PROCESS_TGS)at sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:772)at sun.security.j…

正则限制字符串的长度必须是n的倍数

正则可以帮助我们来判断用户提供的字符串是否是指定长度n的倍数, 写法如下: ^([\w]{8})*$ 说明: ^ 匹配字符串开头; $ 匹配字符串结尾; [\w] 这个为你要限制用户输入的字符串的类型 匹配字母或数字或下划线&am…

每日题库:Huawe数通HCIA——全部【813道】

1.关于ARP报文的说法错误的是?单选 A.ARP报文不能被转发到其他广播域 B.ARP应答报文是单播方发送的 C.任何链路层协议都需要ARP协议辅助获取数据链路层标识 DARP请求报文是广播发送的 答案:C  解析: STP协议不需要ARP辅助 2.园区网络搭建时,使用以下哪种协议可以避免出现二层…

Python与C语言:深入探索两者的奥秘与差异

Python与C语言:深入探索两者的奥秘与差异 在编程的世界里,Python和C语言如同两位性格迥异的伙伴,各自拥有独特的魅力和应用场景。Python以其简洁易懂的语法和强大的库支持赢得了众多开发者的青睐,而C语言则以其接近硬件的低级特性…

【小白专用24.6.8】c#异步方法 async task调用及 await运行机制

await是C#中用于等待异步操作完成的关键字。它通常用于异步方法内部,使得在等待异步操作期间,线程可以继续执行其他操作,从而保持程序的响应性。 在使用await时,需要注意以下几点: 1. async修饰符: 使用…

通过调用栈快速探究 Compose 中 touch 事件的处理原理

前言 Compose 视图的处理方式和 Android 传统 View 有很大差别,针对 touch 事件的处理自然也截然不同。 如何在 Compose 中处理 touch 事件,官方已有非常详尽的说明,可以参考:https://developer.android.google.cn/jetpack/comp…

UG数控编程入门:从基础到精通的全方位指南

UG数控编程入门:从基础到精通的全方位指南 UG数控编程,作为现代制造业中不可或缺的一环,对于初学者来说,既是挑战也是机遇。本文将从四个方面、五个方面、六个方面和七个方面,为你揭示UG数控编程的奥秘,助…