类加载子系统

一.类加载子系统的作用

类加载子系统(Class Loading Subsystem)是Java虚拟机的一个重要组成部分,它将Class文件加载到内存中。不同语言程序可以使用编译器生成符合JVM规范的Class文件,Class文件要求在文件开头有特定的文件标识。除此之外,类加载子系统还负责管理类加载器。
类加载过程
类加载过程如下:
在这里插入图片描述

  1. 加载(Loading): 类加载子系统负责在运行时将.class文件加载到内存中。当程序需要使用某个类时,类加载器会通过类的全限定名(fully qualified name)去查找并加载对应的.class文件。

  2. 链接(Linking): 在加载完成后,类加载子系统会执行链接过程,包括验证、准备和解析三个阶段:

    验证(Verification): 确保加载的类文件符合JVM规范,不会造成安全问题。
    准备(Preparation): 为类的静态变量分配内存空间,并初始化为默认值。
    解析(Resolution): 将类中的符号引用转换为直接引用,即将常量池中的符号引用替换为直接指针、偏移量等形式,以便于后续的访问。

  3. 初始化(Initialization):
    在类加载完成后,类加载子系统会执行类的初始化阶段,包括执行静态变量赋值和静态代码块的初始化等操作。类的初始化是类加载过程中的最后一步,只有在必要的情况下才会执行。

类加载器(ClassLoader):类加载子系统还负责管理类加载器,类加载器根据类加载的要求,从特定的地方(如本地文件系统、网络等)加载类文件,并创建对应的类对象。

通过这些功能,类加载子系统实现了Java语言的动态特性,使得Java程序可以在运行时动态加载和链接类,从而实现了诸如动态扩展、插件化等灵活性需求。

二、类加载器的分类

JVM支持两种类型的类加载器 。分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。
在这里插入图片描述这里的四者之间的关系是包含关系。不是上层下层,也不是子父类的继承关系。

2.1 虚拟机自带的类加载器

启动类加载器(引导类加载器,Bootstrap ClassLoader)
● 这个类加载使用C/C++语言实现的,嵌套在JVM内部。
● 它用来加载Java的核心库(JAVA_HOME/jre/lib/rt.jar、resources.jar或sun.boot.class.path路径下的内容),用于提供JVM自身需要的类
● 并不继承自ava.lang.ClassLoader,没有父加载器。
● 加载扩展类和应用程序类加载器,并指定为他们的父类加载器。
● 出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类

扩展类加载器(Extension ClassLoader)
● Java语言编写,由sun.misc.Launcher$ExtClassLoader实现。
● 派生于ClassLoader类
● 父类加载器为启动类加载器
● 从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/1ib/ext子目录(扩展目录)下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载。

应用程序类加载器(系统类加载器,AppClassLoader)
● java语言编写,由sun.misc.LaunchersAppClassLoader实现
● 派生于ClassLoader类
● 父类加载器为扩展类加载器
● 它负责加载环境变量classpath或系统属性java.class.path指定路径下的类库
● 该类加载是程序中默认的类加载器,一般来说,Java应用的类都是由它来完成加载
● 通过ClassLoader#getSystemclassLoader() 方法可以获取到该类加载

2.2 用户自定义的类加载器

为什么要自定义类加载器?

● 隔离加载类
● 修改类加载的方式
● 扩展加载源
● 防止源码泄漏

用户自定义类加载器可以从非标准位置(如数据库、网络、特定文件系统等)加载类文件,从而实现动态加载、远程加载等功能。并且还可以在加载类文件时执行一些额外的逻辑或增强功能,比如加密解密、访问控制等来防止源码泄漏。

三、双亲委派机制

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

● 1)如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;
● 2)如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;
● 3)如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。
在这里插入图片描述
优点

  • 避免类的重复加载

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

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

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

参考:https://www.yuque.com/u21195183/jvm/rq9lt4

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

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

相关文章

湖仓一体(Lakehouse)架构的核心组件之存储层——Lakehouse 架构(三)

文章目录 前言Lakehouse 存储关键概念行存储与列存储基于存储的查询性能优化 Lakehouse 存储组件云储存文件格式Apache ParquetApache ORCApache Avro相似点和差异点 表格格式Apache HiveIceberg特性和优点 Apache Hudi特性和优点 Delta Lake特性和优点 相似点和差异点 总结 前…

李沐51_序列数据——自学笔记

1.时序模型中,当前数据跟之前观察到的数据相关 2.自回归模型使用自身过去数据来预测未来 3马尔可夫模型假设当前只跟最近少数数据相关,从而简化模型 4.潜变量模型使用潜变量来概括历史信息 生成一些数据:使用正弦函数和一些可加性噪声来生…

【OpenGL开发】PyQt在关闭应用程序时没有运行析构函数的问题

PyQt在关闭应用程序时没有运行析构函数的问题 目录 一、说明二、python的析构函数三、通用版QT5 存在一些问题四、python版PyQt5 存在一些问题五、OpenGL的析构问题5.1 OpenGL很脆弱,这不是危言耸听5.2 以上OpenGL问题解决方法六、一些保留意见一、说明 应用QT做程序界面,在…

工业自动化的未来:UWB模块驱动下的生产优化

随着工业自动化技术的不断发展,UWB技术正在成为工业生产优化的关键驱动力之一。UWB模块作为UWB技术的核心组成部分,具有精准定位、抗干扰、快速响应等特点,为工业自动化提供了新的解决方案和发展机遇。本文将探讨UWB模块驱动下的工业生产优化…

ug钣金展开图教程

UG钣金件如何展平,ug钣金展开步骤?一起来探讨。 第一步:准备一个钣金零件图档(如下图)我们需要进入UG开始-所以应用模块-钣金-NX钣金。 要把这个零件转化为钣金零件,这样才可以进行下一步骤展开。选择转化为钣金,在基本面选择任意一个零件表…

Mysql基础知识学习总结

文章目录 一.数据库的相关概念二.关系模型的核心概念三.SQL分类四.SQL语句注释命令行连接Mysql客户端desc基本用法输出解释示例 show基本用法显示数据库列表显示当前数据库中的表显示表的列信息显示表的索引信息显示服务器状态和系统变量显示创建表的SQL语句显示当前的权限 sel…

遇事不决 量子力学?

文章目录 引入量子力学产生的必然性量子力学名称的由来粒子?波?波粒二象性测不准原理 (不确定原理)叠加态原理 量子纠缠态叠加量子纠缠量子纠缠实验 逻辑判断,量子力学到底完善吗观测量子纠缠?那我们宏观世…

idea中停止运行Vue

在里面敲入Ctrlc 输入y确定即可。

音频调试(2)

前言: 大家好,今天继续分享记录一下最近的音频调试心得!同时这个过程中,也有朋友过来交流音频的问题,通过交流,也是学习到了新东西! 视频和音频复合推流: 在上一篇文章里面有提到fdk…

如何批量在文件名前加序号?文件增加序号前缀的方法 四个方法推荐给你

在日常工作和生活中,我们经常需要处理大量的文件,为了方便管理和查找,给文件增加序号前缀是一种常见的做法。下面将介绍几种给文件增加序号前缀的方法,帮助您更高效地整理文件。 方法一,使用【汇帮批量重命名】添加序…

on display 与on show的区别 展示 Show也用来表达电视节目。”秀” 就是Show的音译。

on show 表演,秀,吸引别人过来看 The most wonderful piece of machinery on show was Nasmyth’s steam hammer. on display 只展示, 有可能他人不会注意 Many colorful clothes are displayed in the showcase. 展示柜里摆放着很多鲜艳…

ASV1000视频监控中心录像服务器,实现存满天数,自动覆盖

目录 一、需求 二、需求分析 (一)录像存满自动覆盖的定义 (二)录像存满指定的天数自动覆盖 三、录像存满天数后自动覆盖在AS-V1000的实现 (一)要考虑的问题 1、确定存储需求 2、设置录像计划 3、配…

ts封装axios遇到的问题

在使用ts封装axios时,这里总是有一个报错,经过一顿搜索,发现错误原因:在TypeScript中,函数的参数类型和返回类型是不等价的,因此导致类型不匹配。 解决方法:将 AxiosRequestConfig 改成 Interna…

2024年第二届“天洑杯”数据建模大赛赛题答疑

“天洑杯”数据建模大赛旨在促进数据分析建模技术的推广和发展,培养一批具有用数据思维解决复杂问题能力的优秀人才,推动高水平人工智能交叉学科人才队伍建设。大赛鼓励参赛选手立足于自身的专业背景和工程实践技能,结合数据科学与人工智能相…

vscode运行 .md文件

1、安装插件 markdown-preview-enhancedmarkdown-all-in-oneMarkdown Preview Mermaid Support paste image LimfxCodeEx Code Spell checker 2、项目文件导入即可 本文为学习笔记,所参考文章均已附上链接,若有疑问请私信! 创作不易&#x…

LeetCode-热题100:114. 二叉树展开为链表

题目描述 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例…

原子的内部结构

原子非常神奇,花时间思考它是非常有价值的。尽管传统的太阳系示意图存在致命的缺点,但我们还是可以局部应用于原子。 首先,原子与太阳系具有相似性一原子的中心质量大,外部质量小。我们用最简单的氢原子做分析,氢原子…

【动态规划 区间dp 位运算】3117. 划分数组得到最小的值之和

本文涉及知识点 动态规划 区间dp 位运算 LeetCode3117. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues,长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组,对于第 ith 个子数组…

SpringBoot集成JWT快速入门Demo

目录 1. 概述 2. JWT的请求流程 3. Session认证与JWT认证的区别 4 JWT优缺点 4.1 优点 4.2 缺点 5. 快速入门 5.1 创建工程 5.2 导入依赖 5.3 添加配置文件 5.4 添加Swagger2配置类 5.5 添加JWT工具类 5.6 添加entity、service、controller类 5.7 添加拦截器类 …

Linux:Redis7.2.4的源码包部署(2)

本章使用的是centos9进行部署 1.获取rpm安装包 Index of /releases/ (redis.io)https://download.redis.io/releases/这个网站有历史的版本,我这里使用的是最新版7.2.4进行安装 点击即可进行下载 方进Linux中,如果你的Linux中可以直接使用wget去下载 2…