类加载器及其类加载子系统

类加载器子系统作用   

      类加载器子系统的作用是负责将字节码文件加载到内存中,并将其转化为能够被虚拟机直接使用的形式。它是Java虚拟机的一部分,具体作用如下:

加载

类加载器负责将类的字节码文件加载到虚拟机的方法区中,以便虚拟机可以使用这些类。

  1. 寻找所需的文件:系统会根据应用程序的路径或配置文件中的指示,寻找所需的代码文件、库文件和资源文件。这些文件可以存储在本地计算机上,也可以存储在网络或云端。

  2. 载入文件到内存:一旦找到所需的文件,系统会将其加载到内存中。加载文件到内存是为了方便对其进行访问和执行。在加载的过程中,系统会分配内存空间来存储文件的数据和代码。

  3. 解析和处理文件:加载文件到内存后,系统会解析文件中的数据和代码,以便能够正确地执行应用程序。解析的过程涉及将代码转换为机器可执行的指令,并对数据进行初始化和处理。

链接

  1. 链接:链接分为三个阶段,包括验证、准备和解析。验证阶段用于确保类的字节码文件满足Java虚拟机的要求;准备阶段负责为类的静态变量分配内存,并设置默认初始值;解析阶段将符号引用解析为直接引用。

验证阶段是连接的第一步,主要目的是确保类的字节码文件满足Java虚拟机的要求,以防止恶意的或者错误的字节码文件被加载和执行。验证阶段通常包括四个子步骤:文件格式验证、元数据验证、字节码验证和符号引用验证。

文件格式验证是验证字节码文件是否符合Class文件格式的规范,包括魔数、版本号、常量池索引等。元数据验证是验证类的元数据信息是否与其他类和接口一致,包括继承关系、实现接口等。字节码验证是验证字节码是否合法、安全,遵循Java虚拟机的执行规范。符号引用验证是验证类的符号引用是否能够正确解析,确保类或者接口的方法、字段能够正确调用和访问。

准备阶段是连接的第二步,主要目的是为类的静态变量分配内存,并设置默认初始值。在类加载时,Java虚拟机会为所有的静态变量分配内存空间,包括基本类型和引用类型。对于基本类型,会将其设置为默认值(例如0、false等);对于引用类型,会将其设置为null。这样,在类的静态变量被访问之前,就已经分配了足够的内存空间,并设置了适当的初始值。

解析阶段是连接的最后一步,主要目的是将符号引用解析为直接引用。在Java程序中,使用符号引用来表示类、字段或者方法的引用,而直接引用则是指向具体的内存地址的指针或者偏移量。解析阶段会将符号引用转化为直接引用,以便在程序运行时能够快速地定位到具体的类、字段或者方法。解析阶段的过程是在运行时动态完成的。

总结起来,连接分为验证、准备和解析三个阶段。验证阶段确保类的字节码文件符合Java虚拟机的要求;准备阶段为类的静态变量分配内存并设置默认初始值;解析阶段将符号引用解析为直接引用。这三个阶段保证了类的正确加载并准备好在程序执行过程中被调用和访问。

初始化

      初始化是类加载过程的最后一步,它负责执行类的初始化代码,包括静态变量赋值和静态代码块的执行等。在Java中,类的初始化是在第一次使用该类时自动进行的,而且初始化只会执行一次。在本文中,我们将详细介绍类的初始化过程,并按照以下几个方面进行阐述:什么时候会触发类的初始化、类的初始化的顺序、静态变量的赋值、静态代码块的执行、以及在初始化过程中可能遇到的一些问题。

一、什么时候会触发类的初始化 类的初始化是在以下几种情况下触发的:

  1. 创建类的实例时,如果该类尚未被初始化,那么会先触发初始化过程,然后再创建实例。
  2. 调用类的静态方法时,如果该类尚未被初始化,那么会先触发初始化过程,然后再调用静态方法。
  3. 访问类的静态变量时,如果该类尚未被初始化,那么会先触发初始化过程,然后再访问静态变量。

二、类的初始化的顺序 在类的初始化过程中,遵循以下几个原则:

  1. 静态变量和静态代码块的初始化按照声明的顺序依次执行。
  2. 静态变量和静态代码块的初始化只会执行一次,不会重复执行。

三、静态变量的赋值 在类的初始化过程中,静态变量的赋值是按照声明的顺序依次执行的。具体的赋值过程如下:

  1. 默认值赋值:对于基本数据类型的静态变量,会先按照默认值进行赋值。比如,int类型的静态变量默认值为0,boolean类型的静态变量默认值为false。
  2. 显式赋值:如果静态变量有显式的赋值语句,会将显式的值赋给静态变量。
  3. 静态代码块赋值:如果静态变量有静态代码块,会执行静态代码块中的赋值语句。

四、静态代码块的执行 静态代码块是在类的初始化过程中执行的,它可以用来进行一些额外的初始化操作。具体的执行过程如下:

  1. 静态代码块会在类被加载到内存中时执行,且只会执行一次。
  2. 静态代码块的执行顺序是按照其在类中的顺序依次执行的。
  3. 静态代码块中的语句可以包括任意合法的Java语句,比如变量赋值、方法调用等。

五、可能遇到的问题 在类的初始化过程中,可能会遇到以下一些问题:

  1. 循环依赖:如果两个类相互依赖,会导致类的初始化陷入死循环。为了避免这种情况,可以使用静态变量或静态代码块来解决循环依赖问题。
  2. 线程安全:在多线程环境下,类的初始化是线程安全的,因为类的初始化过程会由Java虚拟机进行同步控制。
  3. 异常处理:如果在类的初始化过程中发生异常,那么会中断初始化过程,且不会继续对其他类进行初始化。

总结: 类的初始化是类加载过程的最后一步,它负责执行类的初始化代码,包括静态变量赋值和静态代码块的执行等。类的初始化是在第一次使用该类时自动进行的,而且初始化只会执行一次。在初始化过程中,静态变量的赋值是按照声明的顺序依次执行的,静态代码块是按照其在类中的顺序依次执行的。在类的初始化过程中,可能会遇到循环依赖、线程安全和异常处理等问题。

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

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

相关文章

插入损耗 insertion loss

插入损耗 insertion loss 引言正文计算公式示例引言 这里给大家介绍一下,波导中插入损耗的计算公式以及一个示例。 正文 计算公式 I L = 10 log ⁡ ( P i P

L1-061:新胖子公式

题目描述 根据钱江晚报官方微博的报导,最新的肥胖计算方法为:体重(kg) / 身高(m) 的平方。如果超过 25,你就是胖子。于是本题就请你编写程序自动判断一个人到底算不算胖子。 输入格式: 输入在一行中给出两个正数,依次为…

前端面试题css

CSS CSS 属性是否区分大小写? CSS 属性名和属性值在大多数情况下是不区分大小写的,但也有少数例外情况,如 font-variant 和 text-decoration 等属性与其值中的某些字母是区分大小写的。建议在编写 CSS 代码时还是严格遵守大小写以避免不必要…

白龙地铁消费项目(地铁消费系统,包括用户端、管理端)

大一学的C#可视化项目文件,所有功能均可使用。可以直接下载 下方是演示照片

sigmoid softmax优化

1.前言 最近在搞模型部署发现,推理速度不能满足我们需求,于是最近学习了优化算子技巧,学到了sigmoid,softmax算子优化,真的数学之美。2.sigmoid算子优化 一.算子优化图 我们根据sigmoid公式,我们进行求反…

.NET 8 网络改进

作者: Mňa - Software Engineer, .NET Natalia Kondratyeva - Software Engineer, .NET 排版:Alan Wang 随着新的 .NET 版本的发布,发表有关网络空间中新的有趣变化的博客文章已经成为一种传统。今年,我们要介绍 HTTP 部分的变化…

Python RCL 调试劳德巴赫

Python RCL 调试劳德巴赫 比较旧的调试方式是TRACE32 Remote API, 看起来比较麻烦 新的是RCL trace32的安装路径下有官方的python教程, 用浏览器可以打开 <path>/demo/api/python/rcl/doc/html/index.html 需要先安装python库, 也在trace32安装路径下 <path>/de…

谷歌公布 2023 年最受欢迎的 Chrome 扩展

2023年&#xff0c;谷歌公布了最受欢迎的Chrome扩展&#xff0c;共有12款涵盖了多个领域&#xff0c;从提升工作效率到游戏娱乐。这些扩展旨在增强用户的浏览体验和生产力。 Scribe 功能&#xff1a;使用AI记录工作流程并创建逐步指南。 特点&#xff1a;自动记录和生成详细…

【完整项目】基于Python+Tkinter+FFD(free-form deformations)的2D彩色图像实时网格自由变形软件的设计与实现

文章目录 一、效果展示二、前言介绍三、软件使用说明3.1 环境配置3.2 文件结构3.3 准备工作 四、快速开始五、主要思路算法思路网格变形和实时操作思路 六、总结与反思七、代码链接八、其他完整项目 一、效果展示 校正比萨斜塔&#xff1a; 人脸变形&#xff1a; 图像拼接结果…

【运维】大日志文件按日期划分方法的改进及思考

之前由于运维需求&#xff0c;需要对一个大日志文件按照日期进行划分&#xff0c;将每天的日志写入一个单独的文件中。 刚开始接到这个需求后&#xff0c;我浏览了一遍日志文件&#xff0c;发现里面只有11月17号到11月22号的日志&#xff0c;天数不多&#xff0c;可以尝试手动…

conan 入门(三十七):conan 2.x通过定义环境变量(environment)执行make编译只有Makefile的项目(erpcgen)

之前一篇博客《conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例》介绍如何用AutotoolsToolchain,Autotools实现来编译只有Makefile的项目&#xff0c;因为Autotools.make,Autotools.install方法就是执行make来编译项目。 我原本是想用self.run来执行…

C# 读取Word表格到DataSet

目录 功能需求 Office 数据源的一些映射关系 范例运行环境 配置Office DCOM 关键代码 组件库引入 ​核心代码 杀掉进程 总结 功能需求 在应用项目里&#xff0c;多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求&#xff0c;但某些情况下&#xff0c;也存…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十七:演示功能模块相关功能实现

一、本章内容 本章实现常见业务功能,包括文章管理、商品管理、订单管理、会员管理等功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址:

Jenkins 自动设置镜像版本号

使用Jenkins环境变量当作镜像版本号 这样version变量就是版本号,在镜像构建的过程中可以使用 docker build 之后&#xff0c;如果有自己的镜像库&#xff0c;肯定要docker push 一下 至于部署的步骤&#xff0c;一般需要stop并删除原有的容器.我这里用的是docker-compose。同样…

如何使用 pnpm 实现前端 Monorepo项目管理

前言 随着软件开发项目变得越来越庞大和复杂&#xff0c;如何有效管理和维护代码库成为了一个重要的问题。一种流行的解决方案是 Monorepo&#xff0c;也就是在一个版本控制系统中管理所有的项目代码。 什么是 Monorepo Monorepo 是一种项目代码管理方式&#xff0c;指单个仓…

PHP-8.1.0-dev 后门命令执行漏洞复现_zerodiumvar_dump

0x00漏洞描述 PHP 8.1.0-dev 版本在2021年3月28日被植入后门&#xff0c;但是后门很快被发现并清除。当服务器存在该后门时&#xff0c;攻击者可以通过发送User-Agentt头来执行任意代码。 0x01影响范围 PHP 8.1.0-dev 0x02环境搭建 1、本次环境搭建使用vulhub中的docker环…

加速 SQL 查询的 9 种方法

SQL 是开发和查询数据库的主要语言&#xff0c;但它有一些怪癖。在我的上一篇文章中&#xff0c;我分享了 7 个需要避免的 SQL 错误。现在&#xff0c;让我们来看看编写更快的 SQL 查询的 9 个最佳实践。 更快 SQL 查询的 9 个最佳实践 仅检索您需要的列 使用 CASE 而不是 UP…

PPT中加入页码

PPT中加入页码 文章目录 简单版本样式更改 简单版本 PPT中插入页码&#xff0c;基础的就是在“插入”选项卡中单机“幻灯片编号”即可 样式更改 然而&#xff0c;就像我们做幻灯片不满足于白底黑字一样&#xff0c;页码也总不能是默认的样式。 比如&#xff0c;在页码下面…

2023年全国省市区县行政区划矢量数据(含10段线)

2023年&#xff0c;中国地图面貌发生了重大变化&#xff0c;领土面积由960万平方公里扩大到1045万平方公里&#xff0c;九段线改为了十段线。 因此在使用地图的时候&#xff0c;特别是做全国的地图的时候&#xff0c;一定需要最新的行政界限&#xff0c;今天就将最新的省市县行…

http请求超时 ,用PHP如何解决的?

当进行HTTP请求时&#xff0c;有时候可能会遇到请求超时的情况。为了解决这个问题&#xff0c;你可以考虑以下几个方面&#xff1a; 设置脚本的最大执行时间&#xff1a; 在PHP中&#xff0c;可以使用set_time_limit函数来设置脚本的最大执行时间。该函数接受一个以秒为单位的整…