JVM类加载机制以及双亲委派模型的介绍

news2024/9/23 10:27:22

目录

1.类加载介绍

2.具体步骤

2.1加载

2.2验证

2.3准备

2.4解析

2.5初始化

3.加载过程中的策略-双亲委派模型


1.类加载介绍

类加载,指的是Java进程在运行的时候,把.class文件从硬盘读取到内存,并进行一系列校验解析的过程.

.class文件=>类对象.硬盘=>内村

类加载的过程在Java官方文档中有说明

类加载大致可以分为五个步骤:即 加载.验证 准备 解析 初始化这五个步骤.

下面我们分别来介绍这五个步骤干了一些什么

2.具体步骤

2.1加载

把硬盘上的.class文件找到并且打开文件,读取到文件内容.(具体就是二进制的数据)

2.2验证

此过程要确保读到的文件内容是合法的.class文件格式,即字节码文件格式

具体在Java虚拟机规范中有具体的说明.

类似于一个结构体的东西 

其中,u4表示四个字节的无符号证书,u2是连个字节的无符号整数.这里的描述方式类似于C语言中的结构体.contant_pool_count是主版本.下面的是次版本/ jvm执行.class文件的时候就会验证版本是否符合要求,一般高版本可以兼容低版本,反之则不行.magic也叫做magic number 是魔幻数字,广泛应用于二进制文件中,用来标识当前二进制文件的格式是哪种类型

2.3准备

这一步是给类对象申请内存空间.此时申请的内存空间是已经初始化的.里面的默认值为全0.在这个阶段中,类对象的静态成员变量的值也相对于是0了.

2.4解析

主要是对类的字符串常量进行处理 我们观察一下代码:

class Test{

 private String s = "hello";

}

上述代码中,s变量相对于保存了"hello"这个字符串常量的地址.但是文件中并没有地址这个概念,那么该如何保存呢?虽然没有地址,但是有一个类似于地址的偏移量的这一概念

/

此除文件填充给s "hello"的偏移量就可以叫做"符号引用"

接下来,我们把.class文件加载到内存中,就会把"hello"这个字符串加载到内存中.此时它就有地址了,接下来,就可以把s里的值替换成当前"hello"的真实地址了.

2.5初始化

针对对象完成后续的初始化,就是把各个部分的属性进行赋值填充.=>还要执行静态代码的逻辑,黑客拿会触发父类的加载.

而加载过程中也有很多的猫腻.这就涉及到加载环节的一个模型,即双亲委派模型

3.加载过程中的策略-双亲委派模型

该策略描述了如何查找.class文件的策略/

jvm中进行类加载的操作,有一个专门的模块,称为类加载器(ClassLoader)

JVM的类加载器默认有三个.(也可以自定义 ) 这三个分别是 
BootstrapClassLoader  -负责查找标准库的目录

ExtensionClassLoader - 负责查找扩展库的目录 (不同于Java语法规范中的标准库内容,这都是实现jvm的厂商额外扩充的功能,不同的厂商扩展的不一样,这块内容很少会用到了)

ApplicationLoader -负责查找当前项目和第三方库的目录

上述的三个类加载器存在父子关系,类似于二叉树,有一个指针 (引用)指向parent,指向自己的父类加载器.

双亲委派模型的工作过程

1.从ApplicationClassLoader为入口 开始工作

2 从ApplicationClassLoader不会立即工作而是把搜索任务较给自己的父亲ExtensionClassLoader

3ExtensionClassLoader也不会立即寻找,而是交给BootstrapClassLoader 

4BootstrapClassLoader 也不会立即找,也会找自己的父亲

5.BootstrapClassLoader 发现自己没有父亲,才会开始搜索目录,即标准库的内容 寻找符合要求的.class文件,如果找到了就开始打开文件.读文件.如果没找到就交给自己的孩子.尝试加载

6.ExtensionClassLoader收到父亲的任务后,自己搜寻.找到了进入后续流程.找不到就继续到孩子这一类加载器中尝试加载

7 ApplicationClassLoader开始搜索,如果找到了.就继续后面的,如果没找到就搜索自己的孩子,一般来说ApplicationClassLoader它已经没有孩子了,这时候还是找不到,就会抛出一个ClassNotFountExption异常.

按照上述的设定,如果代码中自己定义了一个和标准库一样名字的类,最终程序的执行效果,自己定义的不会被加载,而是会加载标准库中的类.

可以避免自己写的类名字和标准库重名了,导致标准库的类功能失效.

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

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

相关文章

技术栈选型的时候,ruby、go、java、vue、react应该怎么选择?

选择适合项目需求、团队技术背景和偏好、开发速度、性能要求以及可扩展性的技术栈和框架是一个综合考虑的过程,没有一种通用的最佳选择,取决于具体情况。 选择Vue.js或React应该综合考虑项目的需求、团队的技术背景和偏好、生态系统的支持和发展趋势等因…

【Java】面向对象之多态超级详解!!

文章目录 前言一、多态1.1 多态的概念1.2 多态的实现条件1.3 重写1.3.1方法重写的规则1.3.2重写和重载的区别 1.4 向上转型和向下转型1.4.1向上转型1.4.2向下转型 1.5 多态的优缺点1.5.1 使用多态的好处1.5.2 使用多态的缺陷 结语 前言 为了深入了解JAVA的面向对象的特性&…

web开发:如何用Echarts来自动给网页设计各种统计图

很多时候web开发也会需要用到统计图,如果单纯靠我们自己那点拙劣的css和js水平设计的话,又耗时间又做得跟史一样,这时候就需要引入别人设计师为我们设计好的动态统计图——echarts Echarts的官网是:Apache ECharts 1、第一步&…

一个脚本两步计算材料Raman谱(附数据处理和绘图脚本)

在以往推送中已经介绍了相当多的计算材料Raman的方法,使用的软件主要为Phonopy-Spectroscopy,相关软件还有vasp,phonopy,phono3py等。 Phonopy-Spectroscopy计算材料红外和Raman光谱 Phonopy-Spectroscopy 计算红外和拉曼光谱 也…

重学Springboot3-@ConditionalOnXxx条件注解

重学Springboot3-ConditionalOnXxx条件注解 引言常见的条件注解常见的条件注解示例扩展条件注解1. ConditionalOnJndi2. ConditionalOnJava3. ConditionalOnCloudPlatform4. ConditionalOnEnabledResourceChain5. 自定义条件注解 总结 引言 Spring Boot 提供了一组强大的条件注…

2.1 mov、add和sub加减指令实操体验

汇编语言 1. mov操作 1.1 mov移动值 mov指令把右边的值移动到左边 mount c d:masm c: debug r ax 0034 r 073f:0100 mov ax,7t1.2 mov移动寄存器的值 把右边寄存器的值赋值给左边的寄存器 a 073f:0105 mov bx,axt1.3 mov高八位(high)和低八位&am…

cetos7 Docker 安装 gitlab

一、gitlab 简单介绍和安装要求 官方文档:https://docs.gitlab.cn/jh/install/docker.html 1.1、gitlab 介绍 gitLab 是一个用于代码仓库管理系统的开源项目,使用git作为代码管理工具,并在此基础上搭建起来的Web服务平台,通过该平…

C++_数据类型_布尔类型

作用 布尔数据类型代表真或假的值 bool类型只有两个值: ture 真(本质是1)false 假 (本质是0) bool类型占1个字节大小 示例 注意 bool类型,只要是非0的值都代表真

【谈一谈】我们所用的三种工厂模式优缺点

【谈一谈】我们所用的三种工厂模式优缺点 Hello!!大家好啊,好久也没有进行文章的更新了,原因嘛,最近的工作任务量有点大,导致摸鱼充电的时间大量减少,哈哈哈(你别说,这是借口嘛!) 不过,今天是星期六,难的能够在这里分享下最近在工作中,我用到的三种工厂模式(简工抽),有啥区别呢…

国内哪个工具可以平替chatgpt?国内有哪些比较好用的大模型gpt?

我自己试用了很多的平台,发现三个比较好的大模型平台,对普通用户也比较的友好的,而且返回内容相对来说,正确率更高的,并且相关场景插件比较丰富的国内厂商。 本文说的,是我自己觉得的,比较有主观…

linux之进程理解(1)

目录 1. 冯诺依曼体系结构 2. 操作系统(OS) 2.1 概念 2.2 设计OS的目的 2.3 定位 2.4 理解管理 3. 系统调用和库函数概念 4. 补充 1. 冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体…

HCIA-Datacom实验指导手册:8 网络编程与自动化基础

HCIA-Datacom实验指导手册:8 网络编程与自动化基础 一、实验介绍:二、实验拓扑:三、实验目的:四、配置步骤:步骤 1 完成交换机的 Telnet 预配置步骤 2 Python 代码编写 五、结果验证六、windows 计划任务程序配置七、 …

全部都有的子序列

思路(双指针) 先使用Set来存储总共有多少不同的数字,然后我们使用快慢指针去遍历数组,快指针每次遍历到一个数,将其加入到哈希表,哈希表使用pair存储,第一个元素存数字,第二个元素存…

2024最新算法:鳑鲏鱼优化算法(Bitterling Fish Optimization,BFO)求解23个基准函数(提供MATLAB代码)

一、鳑鲏鱼优化算法 鳑鲏鱼优化算法(Bitterling Fish Optimization,BFO)由Lida Zareian 等人于2024年提出。鳑鲏鱼在交配中,雄性和雌性物种相互接近,然后将精子和卵子释放到水中,但这种方法有一个很大的缺…

javaweb请求与响应

前言 前面介绍了对应的服务器端的相关代码。这里开始学习服务器端与客户端的数据请求与响应 这里的仅仅是一个简单的调用,并没有经过servelert接口来进行调用,同前面的一样,我们介绍对应的本地服务器进行的部署项目。 代码 //属于简单的不…

【Memory协议栈】Memory Abstraction Interface模块介绍

目录 前言 正文 1.功能简介 2.关键概念 3.关键类型定义 3.1 MemIf_StatusType 3.2 MemIf_JobResultType 3.3 MemIf_ModeType 4.关键API定义 4.1 MemIf_SetMode 4.2 MemIf_Read 4.3 MemIf_Write 4.4 MemIf_Cancel 4.5 MemIf_GetStatus 4.6 MemIf_GetJobResult 4…

2023年NOC大赛软件创意编程(学而思)赛道图形化小高组复赛试题

目录 第一题 闪烁的星星 第二题 聚沙成塔 第三题 画十字

#WEB前端(DIV、SPAN)

1.实验&#xff1a;DIV、SPAN 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; 类? 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdev…

状态机设计原则系列之效率最大化

检测、搬运类设备,自动运行往往都设计状态机,搬运类对设备节拍往往要求很高,这里我们就需要合理的划分状态机了,使我们的执行效率最大化。有关状态机的系列文章可以查看下面相关文章链接: 1、机器流程控制之建立状态机 https://rxxw-control.blog.csdn.net/article/deta…

智能驾驶规划控制理论学习04-基于车辆运动学的规划方法

目录 一、线性二自由度汽车模型&#xff08;自行车模型&#xff09; 1、二自由度模型概述 2、不同参考点下的状态空间方程 3、前向仿真 二、运动基元生成方法 1、杜宾斯曲线&#xff08;Dubins Curve&#xff09; 2、Reeds Shepp Curve 三、多项式曲线&#xff08;Poly…