JAVA类加载机制

news2024/11/16 12:29:11

在Java的世界里,每一个类或者接口,在经历编译器后,都会生成一个个.class文件。

类加载机制指的是将这些.class文件中的二进制数据读入到内存中,并对数据进行校验,解析和初始化。最终,每一个类都会在方法区保存一份它的元数据,在堆中创建一个与之对应的Class对象。

java的类加载机制主要分为七个步骤
加载,校验,准备,解析,初始化,使用,卸载
加载:
1.根据类的全名找到对应的class文件
2.将class文件中的二进制文件读取出来,在方法区生成对应的数据结构
3.在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口

校验:
Class文件中的内容是字节码,这些内容可以由任何途径产出,验证阶段的目的是保证文件内容里的字节流符合Java虚拟机规范,且这些内容信息运行后不会危害虚拟机自身的安全。

准备:
这个阶段,类的静态字段信息(即使用 static 修饰过的变量)会得到内存分配,并且设置为初始值。

例如:public static int value = 3 类变量 value 在准备阶段设置的初始值是 0,不是
3。把value赋值为3的 putstatic 指令是在程序编译后,存放于类构造器 () 方法中的,所以把 value
赋值为 3 的动作将在初始化阶段才会执行。 当使用 final 修饰后:public static final int value = 3
类变量 value 在准备阶段设置的初始值是 3,不是 0。

解析:
这个阶段,虚拟机会把这个Class文件中,常量池内的符号引用转换为直接引用。主要解析的是 类或接口、字段、类方法、接口方法、方法类型、方法句柄等符号引用。我们可以把解析阶段中,符号引用转换为直接引用的过程,理解为当前加载的这个类,和它所引用的类,正式进行“连接“的过程。

初始化:
初始化的过程,就是执行类构造器 ()方法的过程。
当初始化完成之后,类中static修饰的变量会赋予程序员实际定义的“值”,同时类中如果存在static代码块,也会执行这个静态代码块里面的代码。

类加载器

还记得在加载阶段,通过类的全限定名,获取该类字节流数据的这个动作么,类加载器就是用来实现这个动作的。

双亲委派模型:

双亲委派模型是Java类加载器的一种工作机制,它是一种层次化的类加载器结构,其中每个类加载器都有一个父类加载器。当某个类加载器需要加载一个类时,它首先会将这个请求委派给自己的父类加载器去完成。如果父类加载器无法完成这个加载请求,子类加载器才会尝试自己去加载这个类。这个过程一直持续到顶层的启动类加载器,如果启动类加载器无法完成加载请求,就会抛出ClassNotFoundException异常。

双亲委派模型的具体工作过程如下:

  1. 当Java虚拟机启动时,会先由启动类加载器(Bootstrap ClassLoader)加载核心类库(如java.lang包),这些类库是虚拟机运行所必需的类。

  2. 当应用程序需要加载某个类时,它首先会由系统类加载器(System ClassLoader)去尝试加载这个类。如果系统类加载器无法完成这个加载请求,它会将请求委派给它的父类加载器——扩展类加载器(Extension ClassLoader)去完成。

  3. 如果扩展类加载器也无法完成加载请求,它会将请求继续委派给它的父类加载器——启动类加载器去完成。启动类加载器是虚拟机内置的类加载器,它是类加载器层次结构的最顶层,所有其它类加载器的父类加载器都是它。

  4. 如果启动类加载器仍然无法完成加载请求,就会抛出ClassNotFoundException异常。

采用双亲委派模型的好处是可以有效避免类的重复加载,同时也可以保护Java核心类库不受恶意代码的侵害。当一个类被加载时,它会优先从父类加载器的缓存中查找是否已经加载过。如果已经加载过,就直接返回缓存中的类对象,避免了重复加载。如果没有加载过,就会委派给父类加载器去完成加载请求,父类加载器也会先从它的缓存中查找是否已经加载过,以此类推,直到找到顶层的启动类加载器为止。这样可以保证类的唯一性和一致性,避免出现类的版本冲突和安全问题。

总之,双亲委派模型是Java类加载器的一种工作机制,它采用层次化的类加载器结构,并将类加载请求委派给父类加载器去完成,以此保证类的唯一性和一致性。
在这里插入图片描述

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

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

相关文章

ChatGPT - 学习和提高新技能的Prompt

文章目录 Prompt例子 Prompt “我想学习/提高[技能]。我是一个完全的初学者。创建一个30天的学习计划,可以帮助像我这样的初学者学习和提高这项技能。”例子 我想学习/提高Flink。我是一个完全的初学者。 创建一个30天的学习计划,可以帮助像我这样的初…

Xilinx Artix-7【XC7A35T-2CSG324I】【XC7A35T-1CSG324I】成本与收发器优化的FPGA器件

产品介绍: Xilinx Artix -7系列 FPGA 重新定义了成本敏感型解决方案,功耗比上一代产品降低了一半,同时为高带宽应用提供一流的收发器和信号处理能力。这些设备基于 28 纳米 HPL 工艺构建,提供一流的性能功耗比。与 MicroBlaze™ 软…

boot-admin整合Liquibase实现数据库版本管理

Liquibase 和 Flyway 是两款成熟的、优秀的、开源/商业版的数据库版本管理工具,鉴于 Flyway 的社区版本对 Oracle 数据库支持存在限制,所以 boot-admin 选择整合 Liquibase 提供数据库版本管理能力支持。 Liquibase 开源版使用 Apache 2.0 协议。 Liqui…

实现服务器版本---表白墙(Servlet)

目录 一、创建Servlet项目 二、约定前后端交互接口 三、前端代码 四、后端代码 五、效果演示 结合Servlet API ,实现一个服务器版本表白墙。实现的这个表白墙,就通过服务器来保存这里的消息数据,进而做到 “持久化” 存储。 一、创建Se…

浮点数中的阶码和尾数

阶码和尾数 阶码尾数浮点数浮点数表示示例 例题分析总结 阶码 在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码。 尾数 常用对数的小数部分,用于科学计数法,其表示方法为:Mantissa x Base^Expo…

k210单片机的串口交互实验

先来看看实验的结果吧,k210的9口为RX,10口为TX。接线: 9口接usb转ttl的TX 10口接usb转ttl的RX 下面介绍一下k210需要使用的模块: K210 一共有 3 个串口,每个串口可以自由映射引脚。 例: # IO10→RX1&#…

JuiceFS__持久化缓存源码走读

JuiceFS__持久化缓存源码走读 JuiceFS 是一款高性能 POSIX 文件系统,针对云原生环境特别优化设计,在 Apache 2.0 开源协议下发布。使用 JuiceFS 存储数据,数据本身会被持久化在对象存储(例如 Amazon S3),而…

java小记 2023-05-05

public class Test {/*** 谓类的方法就是指类中用static 修饰的方法(非static 为实例方法),比如main 方法,那么可以以main* 方法为例,可直接调用其他类方法,必须通过实例调用实例方法,this 关键…

7.3 有源滤波电路(2)

四、开关电容滤波器 开关电容电路由受时钟脉冲信号控制的模拟开关、电容器和运算放大电路三部分组成。这种电路的特性与电容器的精度无关,而仅与各电容器电容量之比的准确性有关。在集成电路中,可以通过均匀地控制硅片上氧化层的介电常数及其厚度&#…

国产版ChatGPT大盘点

我们看到,最近,国内大厂开始密集发布类ChatGPT产品。 一方面,是因为这是最近10年最大的趋势和机会。 另一方面,国内的AI,不能别国外卡了脖子。 那在类ChatGPT赛道上,哪些中国版的ChatGPT能快速顶上?都各有哪些困境需要突破呢?本文给诸位带来各个玩家的最新进展。 *…

大数据Doris(十二):Unique数据模型

文章目录 Unique数据模型 一、读时合并 二、写时合并 Unique数据模型 在某些多维分析场景下,用户更关注的是如何保证 Key 的唯一性,即如何获得 Primary Key 唯一性约束。因此,我们引入了 Unique 数据模型,该模型可以根据相同的Primary Key 来保留后插入的数据,确保数据…

Day962.如何更好地重构和组织后端代码 -遗留系统现代化实战

如何更好地重构和组织后端代码 Hi,我是阿昌,今天学习记录是关于如何更好地重构和组织后端代码的内容。 如果说在气泡上下文中开发新的需求,类似于老城区旁边建设一个新城区,那么在遗留系统中开发新的需求,就类似于在…

c++的构造函数与析构函数

构造函数是一种特殊的成员函数,用于在对象创建时初始化对象的成员变量。它的名称与类名相同,没有返回类型,可以有参数。当创建对象时,构造函数会自动调用,以初始化对象的成员变量。如果没有定义构造函数,编…

华为OD机试真题-24点运算【2023】【JAVA】

一、题目描述 计算24点是一种扑克牌益智游戏,随机抽出4张扑克牌,通过加(),减(-),乘(*), 除(/)四种运算法则计算得到整数24,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写jo…

PCL1.12.0+Vtk7.1.1安装

1. qt4:Ubuntu 20.04 LTS 安装qt4 library_ubuntu20.04安装qt4 2.本文下载过程可参考1:ubuntu20.04下安装pcl_ubuntu安装pcl_Yuannau_jk的博客-CSDN博客 参考2:Ubuntu 20.04.05安装PCL-1.12.0_no package metslib found_zhiTjun的博客-CSDN…

解决 IDEA中的Tomcat服务器控制台乱码

解决 IDEA中的Tomcat服务器控制台乱码 问题描述:当我们使用idea编辑器部署web程序到tomcat服务器上,当我们运行tomcat的时候控制台出现服务器输出内容乱码的情况,这个问题可能是由于编码不一致引起的。在IDEA中,如果项目的编码方…

HttpServletRequest在Spring中的获取和注入 @Autowired注入Request

问题描述: 在最近一次团队review代码时,团队成员发现有将HttpServletRequest 直接通过Autowired注入的情况,于是大家产生了一个疑问,HttpServletRequest并非Spring中的类,且在没有手动通过Bean的方式注入,…

Oracle数据库、实例、用户、表空间、表之间的关系

数据库: Oracle数据库是数据的物理存储。这就包括(数据文件ORA或者DBF、控制文件、联机日志、参数文件)。其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作是Oracle就只有一个大数据库。…

Vue核心 绑定样式 条件渲染

1.11.绑定样式 class样式: 写法::class“xxx”,xxx 可以是字符串、数组、对象:style“[a,b]” 其中a、b是样式对象**:style“{fontSize: xxx}”**其中 xxx 是动态值 字符串写法适用于:类名不确定,要动态获取数组写法…

HTB靶机07-Cronos-WP

cronos IP:10.10.10.13 scan ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.13 Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-06 23:19 CST Nmap scan report for 10.10.10.13 Host is up (0.23s latency). Not shown: 997 closed tcp por…