06JVM_类加载器

news2025/1/15 6:31:57

一、类加载器

以JDK8为例:

①启动类加载器

②扩展类加载器

③应用程序类加载器

④自定义类加载器

①类加载器具有层级关系,当加载一个类的时候,要看所有的上级有没有加载此类。【双亲委派模式】

②类加载器负责在运行时将Java类动态加载到JVM(Java虚拟机),是JRE(Java运行时环境)的一部分。由于类加载器的存在,JVM无需了解底层文件或文件系统即可运行Java程序。

1.启动类加载器:Bootstrap ClassLoader

①启动类加载器是使用C++实现的,嵌套在JVM内部,因此java程序无法直接访问。getClassLoader()得到null

②启动类加载器用来加载jre和jre/lib目录下的核心库,如 java.lang.*,java.util.* 等

③启动类加载器没有父类加载器

④启动类加载器加载扩展类加载器和应用程序类加载器,成为他的父类加载器

2.扩展类加载器 Extension ClassLoader

①扩展类加载器用于加载JVM扩展目录中的类库,位于JDK安装目录下的jre/lib/ext目录中的jar包或目录。

②扩展类的加载器的父类加载器是启动类加载器。

③Java语言编写,由sun.misc.Launcher$ExtClassLoader实现

3.应用程序类加载器Application Class Loader

①系统类加载器,它负责加载用户0类。

②它会搜索应用程序的类路径(包括用户定义的类路径和系统类路径),并加载类文件。

③是java应用程序默认的类加载器

4.自定义类加载器

当不满足开发时,可以自定义加载器。比如用网络加载Java类,为了保证传输中的安全性,采用了加密操作,那么以上3种加载器就无法加载这个类,这时候就需要自定义加载器。

实现步骤

①继承ClassLoader父类

②遵从双亲委派模式,重写findClass方法

③读取类文件的字节码

④调用父类的defineClass方法加载类

⑤使用者调用该类的加载器loadClass方法

二、类加载机制-双亲委派模式

1.介绍

①JVM对class文件采用按需加载的方式,当需要该类的时候,jvm才会将class文件加载到内存产生class对象。

②在加载类的时候,采用双亲委派机制。把请求交给父类处理的一种任务委派模式

 

2.工作原理

①如果一个类加载器接收到了类加载请求,它自己不会先去加载,会把这个请求委托给父类加载器去执行。

②如果父类还存在父类加载器,就继续向上委托。一直委托到启动类加载器:Bootstrap ClassLoader

③如果父类加载器可以完成加载任务,就返回成功结果。如果父类加载失败,就由子类自己加载,如果失败抛出ClassNotFoundException异常,这就是双亲委派模式

3.优缺点

优点:

①保证安全性,层级关系代表优先级,也就是所有类的加载,优先给启动类加载器,这样就保证了核心类库类

②避免类的重复加载,如果父类加载器加载过了,子类加载器就没有必要再去加载了,确保一个类的全局唯一性

缺点:

①检查类是否加载的委派过程是单向的,即顶层的ClassLoader 无法访问底层的ClassLoader 所加载的类

②启动类加载器中的类为系统核心类,包括一些重要的系统接口,而在应用类加载器中,为应用类。 按照这种模式, 应用类访问系统类自然是没有问题,但是系统类访问应用类就会出现问题。

 

三、线程上下文类加载器

1. 线程上下文类加载器就是双亲委派模型的破坏者,可以在执行线程中打破双亲委派机制的加载链关系,从而使得程序可以逆向使用类加载器

2.Java提供了很多核心接口的定义,这些接口被称为SPI接口,同时为了方便加载第三方的实现类,SPI提供了一种动态的服务发现机制(约定),只要第三方在编写实现类时,在工程内新建一个META-INF/services/目录并在该目录下创建一个与服务接口名称同名的文件,那么在程序启动的时候,就会根据约定去找到所有符合规范的实现类,然后交给线程上下文类加载器进行加载处理

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

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

相关文章

4.开放-封闭原则

这个原则其实是有两个特征,一个是说‘对于扩展是开放的(Open for extension),另一个是说‘对于更改是封闭的(Closed for modification)[ASD]。

走近Callable

1.特点 可以有返回值可以抛出异常方法不同, run() / call(); Callable 接口类似于Runnable ,因为它们都是为其实例可能有另一个线程执行的类设计的, 然而,Runnable不返回结果,也不能抛出被检查的异常。 2.代码测试…

互联网数字化管理升级,制造企业一站式智能管理,可定制-亿发

在互联网时代,传统机械制造企业面临着未有的挑战和机遇。信息化管理水平成为企业竞争力的关键因素。然而,许多制造企业在信息化管理中常常陷入以下三大问题: 1、盲目随潮流,缺乏总体规划 互联网时代,科技发展日新月异…

python基础复习-基本数据类型

目录 数字进制转换小数精度科学计算库 字符串转义符正向/反向索引正向/反向切片成员运算字符编码字符串处理 布尔类型指示条件作为掩码 类型转换 数字 进制转换 a10 bbin(a) coct(a) dhex(a) print(a,b,c,d) print(type(a)) print(type(b)) print(type(c)) print(type(d))10 …

Spring Cloud超越微服务:服务网格的崭露头角

文章目录 1. 微服务的挑战2. 什么是服务网格?3. Spring Cloud和服务网格服务发现负载均衡安全性服务网格扩展 4. 服务网格的优势4.1. 解耦通信逻辑4.2. 提高可观察性4.3. 灰度发布和流量控制4.4. 安全性 5. 未来展望6. 结论 🎉欢迎来到架构设计专栏~Spri…

【办公自动化】用Python在Excel中查找并替换数据(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

Python 潮流周刊#20:三种基准测试的方法、为什么代码在函数中运行得更快?

△点击上方“Python猫”关注 ,回复“1”领取电子书 你好,我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容,大部分为英文。标题取自其中两则分享,不代表全部内容都是该主题,特此声明。 本周刊由 Python猫 出品…

【Qt】Qt中关联容器QMap,QMultiMap,QHash,QMultiHash 的理解

在Qt中,有几种关联容器可供选择: QMap:QMap是一个关联容器,存储键-值对,并根据键自动进行排序。它提供了快速的查找和插入操作,适用于需要根据键进行排序和搜索的场景。 QMultiMap:QMultiMap是…

软件测评中:电子政务系统怎么测评?

1、文件依据: 1)《中华人民共和国政府采购法实施条例》(中华人民共和国国务院令 第658号) 第四十一条“大型或者复杂的政府采购项目,应当邀请国家认可的质量检测机构参加验收工作。” 2) 《国务院办公厅关于印发国家政务信息化…

深入Android系统基础知识及基本概念

深入Android系统基础知识及基本概念 Android应用程序的基本组成部分,包括Activities(活动)、Services(服务)、Broadcast receivers(广播接收器)和Content providers(内容提供者&…

Mysql---第八篇

系列文章目录 文章目录 系列文章目录一、mysql执行计划怎么看一、mysql执行计划怎么看 执行计划就是sql的执行查询的顺序,以及如何使用索引查询,返回的结果集的行数 EXPLAIN SELECT * from A where X=? and Y=? 1。id :是一个有顺序的编号,是查询的顺序号,有几个 sel…

ModbusTCP服务端

1在Device下,添加设备net: 公交车。 2在net下添加 ModbusTCP

技术人员如何提升商业敏感度?

在商业领域,最基本也是最实用的财务知识,就是看懂三张报表。简单地说,现金流量表,决定企业能不能活下来;资产负债表和利润表,决定企业活得好不好。下面分别来学习这三张报表。 资产负债表 资产负债表&#…

浅谈一下前端字符编码

背景 众所周知,计算机只能识别二进制,它是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用二进制数的0和1表示。但是现实中存在着其他的字符:数字、字母、中文、特殊符号…

如何实现Web应用、网站状态的监控?

如何实现Web应用、网站状态的监控? 关键词:网站监控,服务器监控,页面性能监控,用户体验监控本文通过代码分析、网站应用介绍网站状态监控的方式下文主要分为网站应用、技术实现两部分 一、网站应用 现在网络上已经存在一些Web网站监控的服务&#xff…

Vue ——08、路由嵌套,参数传递及重定向

路由嵌套,参数传递及重定向 一、路由嵌套二、参数传递第一种方式:第二种方式: 三、重定向————————创作不易,如觉不错,随手点赞,关注,收藏(* ̄︶ ̄),谢…

【C++杂货铺】继承由浅入深详细总结

文章目录 一、继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承方式和访问限定符1.2.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类中的默认成员函数4.1 默认构造函数4.2 拷贝构造函数4.3 赋值运算符重载函数4.…

03使用Spring基于XML的方式注册第一个组件

基于XML的方式注册第一个组件 开发步骤 第一步: 创建Maven工程配置生成的pom.xml文件, 添加spring context基础依赖和junit依赖(注意根据Spring官方文档描述,Spring6需要JDK版本17) 当添加Spring的基础依赖spring context之后,Maven会自动关联并引入其他依赖spring aop, spr…

前端生态系统:构建现代Web应用的完整指南

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 前端开发生态系统是一个…

Selenium常见问题解析

1、元素定位失败: 在使用Selenium自动化测试时,最常见的问题之一是无法正确地定位元素,这可能导致后续操作失败。解决方法包括使用不同的定位方式(如xpath、CSS selector、id等),等待页面加载完全后再进行…