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

目录

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.mzph.cn/news/714890.shtml

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

相关文章

智能驾驶规划控制理论学习03-基于采样的规划方法

目录 一、基于采样的规划方法概述 二、概率路图(PRM) 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树(RRT) 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…

运筹学_1.1.2 线性规划问题-图解法

1.1.2 线性规划问题-图解法 一、图解法求解步骤(只适用于两个决策变量问题)二、图解法作图实例三、图解法分析线性规划几种解的情况1、唯一最优解2、无穷多最优解3、无界解4、无解或无可行解 四、图解法的几点启示 一、图解法求解步骤(只适用…

深入浅出Redis(一):对象与数据结构

引言 Redis是一款基于键值对的数据结构存储系统,它的特点是基于内存操作、单线程处理命令、IO多路复用模型处理网络请求、键值对存储与简单丰富的数据结构等等 这篇文章主要围绕Redis中的对象与数据结构来详细说明键值对存储与简单丰富的数据结构这两大特点 Redi…

运筹学_1.1.4 线性规划问题-解的概念

1.1.4 线性规划问题-解的概念 一、可行解与最优解二、基的概念三、基变量、基向量;非基变量、非基向量;基解、基可行解;四、最优解与可行解、基可行解的关系五、用例题(枚举法)巩固基解、基可行解、最优解三个概念1、例…

5、DVWA代码审计(2)

一、csrf 1、csrf(low) 限制 复现 GET /vulnerabilities/csrf/?password_new123456&password_conf123456&ChangeChange HTTP/1.1 Host: ddd.com Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,…

电子电器架构 —— DoIP协议相关的介绍

电子电器架构 —— DoIP协议相关的介绍 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕…

vue3编写H5适配横竖屏

具体思路如下&#xff1a; 1、监听浏览器屏幕变化&#xff0c;通过监听屏幕宽高&#xff0c;辨别出是横屏&#xff0c;还是竖屏状态 在项目的起始根页面进行监听&#xff0c;我就是在App.vue文件下进行监听 代码如下&#xff1a; <template><RouterView /> <…

【Spring IoC】实验四:特殊值处理

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

C++ //练习 10.16 使用lambda编写你自己版本的biggies。

C Primer&#xff08;第5版&#xff09; 练习 10.16 练习 10.16 使用lambda编写你自己版本的biggies。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*******************************************************************…

BERTopic安装最全教程及报错处理

BERTopic安装 BERTopic的安装比较复杂,直接安装会报错 安装方法1,.whl文件安装 ERROR: Could not build wheels for hdbscan, which is required to install pyproject.toml-based projects正确安装流程 查看python能安装whl的版本pip debug --verbose Compatible tags: 2…

图表背后的智慧:办公场景中的数据可视化革新

在现代办公场景中&#xff0c;数据可视化的应用已经成为提高效率、推动创新的得力工具。无论是管理层还是普通员工&#xff0c;都能从数据可视化中受益匪浅。下面我就以可视化从业者的角度&#xff0c;简单聊聊这个话题。 首先&#xff0c;数据可视化提升了数据的易读性与理解性…

【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug

文章目录 前言 State断点 Transition断点 条件断点 按State步进 Watch Data Value Sequence Viewer 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑…

Flink状态存储-StateBackend

文章目录 前言一、MemoryStateBackend二、FSStateBackend三、RocksDBStateBackend四、StateBackend配置方式五、状态持久化六、状态重分布OperatorState 重分布KeyedState 重分布 七、状态过期 前言 Flink是一个流处理框架&#xff0c;它需要对数据流进行状态管理以支持复杂的…

10个技巧,3分钟教会你高效寻找开源项目

作为程序员&#xff0c;不论是开发还是学习&#xff0c;肯定会用到开源项目&#xff0c;那么怎么快速在开源网站找到这些项目呢&#xff1f; 常用的开源网站有&#xff1a;github 和 gitee github是全球最大的开源社区&#xff0c;今天就以github为例&#xff0c;演示一下 gi…

JavaWeb之 Servlet(2万6千字详解)

目录 前言1. Servlet 简介2. Servlet 前世今生3. Servlet 执行流程4. Servlet 快速入门5. 两种配置 Servlet程序 URL的方式5.1 使用 注解来配置 Servlet程序 的 URL5.1.1 urlPattern 的配置规则精确匹配目录匹配&#xff1a;使用 * 符号代表任意路径扩展名匹配任意匹配 5.1.2 小…

【MATLAB】语音信号识别与处理:SG滤波算法去噪及谱相减算法呈现频谱

1 基本定义 SG 滤波算法&#xff08;Savitzky - Golay 滤波算法&#xff09;是一种数字信号处理算法&#xff0c;用于对信号进行平滑处理。该算法利用最小二乘法拟合局部数据段&#xff0c;然后用拟合的函数来估计每个数据点的值&#xff0c;从而实现平滑处理。 SG 滤波算法的…

redis05 sprngboot整合redis

redis的Java客户端 整合步骤 添加redis的pom依赖 <!-- 引入redis依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency><!-- 引入redis连…

51单片机学习day02

基于普中的stc89c52&#xff0c; 串口&#xff1a; 通讯接口&#xff0c;51单片机自带UART&#xff08;通用异步收发器&#xff09;&#xff0c;可实现窗口通讯。 硬件电路&#xff1a; 简单双向串口通信有两根通信线&#xff08;发送端TXD和接收端RXD&#xff09;&#xff0…

HelixToolKit的模型旋转操作

前面加载了模型以后&#xff0c;鼠标拖动和缩放比较好操作&#xff1b;但是旋转似乎没有&#xff0c; 操作了一阵&#xff0c;也不是没有&#xff0c;应该是还不熟悉&#xff1b; 旋转的指示器在右下角&#xff0c;现在U面看到正面&#xff0c; 想看一下模型的背面&#xff0…

【Java项目介绍和界面搭建】拼图小游戏——添加图片

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …