类加载的基本流程

news2024/11/16 17:35:37

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:JavaEE
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖

类加载

  • 1. 加载
  • 2. 验证
  • 3. 准备
  • 4. 解析
  • 5. 初始化
  • 6. 双亲委派模型

对于⼀个类来说,它的⽣命周期是这样的:
在这里插入图片描述

1. 加载

“加载”(Loading)阶段是整个“类加载”(Class Loading)过程中的⼀个阶段,它和类加载
Class Loading 是不同的,⼀个是加载 Loading 另⼀个是类加载 Class Loading。

在加载 Loading 阶段,Java虚拟机需要完成以下三件事情:

  1. 通过⼀个类的“全限定名”来获取定义此类的⼆进制字节流
  2. 将这个字节流所代表的静态存储结构转化为⽅法区的运⾏时数据结构
  3. 在内存中⽣成⼀个代表这个类的java.lang.Class对象,作为⽅法区这个类的各种数据的访问⼊⼝

也就是找到.class文件,打开文件,读取文件内容。
当代码中给定某个类的“全限定类名”,比如:java.lang.String,java.util.ArrayList,然后jvm就会根据这个类名在一些指定的目录范围内查找。

2. 验证

验证是连接阶段的第⼀步,这⼀阶段的⽬的是确保Class⽂件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运⾏后不会危害虚拟机⾃⾝的安全。

验证选项:

  • ⽂件格式验证
  • 字节码验证
  • 符号引⽤验证

3. 准备

准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。
⽐如此时有这样⼀⾏代码:

public static int value = 123;

它是初始化 value 的 int 值为 0,⽽⾮ 123

只是分配内存空间,还没有初始化。此时这个空间上的内存的数值,就是全0的。

4. 解析

针对类对象中包含的字符串常量进行处理,进行一些初始化操作。也就是将常量池内的符号引用替换为直接引用

比如:final String s="abc",当字符串常量 s 在编译之后,也会进入 .class 文件,同时在 .class 文件的二进制指令中,也会有一个 s 这样的引用被创建出来。我们知道引用里本质上保存的是一个变量的地址,但在.class文件中,不涉及到内存地址,因此在.class 文件中,s的初始化语句,就会先被设置成一个“文件的偏移量”,通过偏移量,就能找到 “abc” 这个字符串所在的位置,当我们这个类真正被加载到内存中的时候,再把这个偏移量替换回真正的内存地址。

5. 初始化

初始化阶段,Java 虚拟机真正开始执⾏类中编写的 Java 程序代码,将主导权移交给应⽤程序。针对类对象进行初始化,初始化阶段就是执⾏类构造器⽅法的过程。
比如:把类对象中需要的各个属性都设置好;初始化好static成员;执行静态代码块;还可能需要加载一下父类等等。

6. 双亲委派模型

双亲委派模型属于类加载中第一个步骤“加载”过程中的一个环节。它的作用就是根据全限定名找到 .class文件。

解释:类加载器是JVM中的一个模块,而JVM内置了三个类加载器。
当⼀个类加载器收到了类加载的请求,它⾸先不会⾃⼰去尝试加载这个类,⽽是把这个请求委派给⽗类加载器去完成,每⼀个层次的类加载器都是如此,因此所有的加载请求最 终都应该传送到最顶层的启动类加载器中,只有当⽗加载器反馈⾃⼰⽆ 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,⼦加载器才会尝试⾃⼰去完成加载。

在这里插入图片描述
上图类加载的过程(找.class 文件的过程)

  1. 给定一个类的全限定类名,形如java.lang.String
  2. 从Application ClassLoader作为入口,开始执行查找的逻辑
  3. Application ClassLoader,不会立即去扫描自己负责的目录(负责的是搜索项目当前目录和第三方库对应目录)而是把查找的任务,交给它的父亲,Extension Classloader
  4. Extension ClassLoader也不会立即扫描自己负责的目录(负责的是 JDK中一些扩展的库,对应的目录)而是把查找的任务,交给它的父亲BootStrap ClassLoader
  5. BootStrap Classloader,也不想立即扫描自己负责的目录(负责的是标准库的目录), 也想把任务交给它的父亲,结果发现自己没有父亲!因此BootStrap ClassLoader 只能亲自负责扫描标准库的目录
  6. 没有扫描到,就会回到Extension ClassLoader。Extension ClassLoader就会扫描负责的扩展库的目录。如果找到,就执行后续的类加载操作,此时查找过程结束;如果没找到,还是把任务交给孩子来执行
  7. 没有扫描到,就会回到Application ClassLoader。Application ClassLoader就会负责扫描当前项目和第方库的目录。如果找到,就执行后续的类加载操作。如果没找到,就会抛出一个ClassNotFoundException

优点:

  • 避免重复加载类:⽐如 A 类和 B 类都有⼀个⽗类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进⾏加载时就不需要在重复加载 C 类了。
  • 安全性:使⽤双亲委派模型也可以保证了 Java 的核⼼ API 不被篡改,如果没有使⽤双亲委派模
    型,⽽是每个类加载器加载⾃⼰的话就会出现⼀些问题,⽐如我们编写⼀个称为 java.lang.Object
    类的话,那么程序运⾏的时候,系统就会出现多个不同的 Object 类,⽽有些 Object 类⼜是⽤⼾⾃⼰提供的因此安全性就不能得到保证了。

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

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

相关文章

el-select 中嵌套时间选择器 el-time-picker 并且实现时间多选功能

el-select 中嵌套时间选择器 el-time-picker 并且实现时间多选功能 需求是&#xff1a;时间可多选 element中时间的选择不支持多选 下面进行封装拼接时间多选 <el-form ref"ruleFormRef" :model"ruleForm" :rules"rules" label-width"…

应用在汽车电子控温器中的多路数字温度传感芯片

温控器&#xff0c;是指根据工作环境的温度变化&#xff0c;在开关内部发生物理形变&#xff0c;从而产生某些特殊效应&#xff0c;产生导通或者断开动作的一系列自动控制元件&#xff0c;也叫温控开关、温度保护器、温度控制器&#xff0c;简称温控器。或是通过温度保护器将温…

群晖NAS配置WebDav结合内网穿透实现公网访问本地影视资源

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是&#xff1a;1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透&#xff0c;映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…

Vue3 学习笔记(Day6)

「写在前面」 本文为尚硅谷禹神 Vue3 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. Vue3 学习笔记&#xff08;Day1&#xff09; 2. Vue3 学习笔记&#xff08;Day2&…

【字典树】【KMP】【C++算法】3045统计前后缀下标对 II

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 字符串 字典树 KMP 前后缀 LeetCode:3045统计前后缀下标对 II 给你一个下标从 0 开始的字符串数组 words 。 定义一个 布尔 函数 isPrefixAndSuffix &#xff0c;它接受两个字符串参数 str1 和 str2 &#xff1a; 当 st…

【Python】PyGameUI控件

哈里前段时间写了一个windows平板上自娱自乐&#xff08;春节和家人一起玩&#xff09;基于pygame的大富翁游戏。 pygame没有按钮之类的UI控件&#xff0c;写起来不怎么顺手。就自己写一个简单的框架。 仓库地址 哈里PygameUi: pygame ui封装自用 (gitee.com) 使用示例 示…

民爆5G智能制造工厂数字孪生可视化平台,推进民爆工业数字化转型

民爆5G工厂智能制造数字孪生可视化平台&#xff0c;推进行业数字化转型。民爆行业作为国家经济发展的重要支柱产业&#xff0c;其数字化转型对于提高生产效率、降低成本、保障安全等方面具有重要意义。而民爆5G工厂智能制造数字孪生可视化平台正是推进行业数字化转型的关键技术…

网络编程 io_uring

io_uring 1、概述 io_uring是Linux&#xff08;内核版本在5.1以后&#xff09;在2019年加入到内核中的一种新型的异步I/O模型&#xff1b; io_uring使用共享内存&#xff0c;解决高IOPS场景中的用户态和内核态的切换过程&#xff0c;减少系统调用&#xff1b;用户可以直接向…

BioTech - 大分子药物设计 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/136302202 大分子药物设计领域主要包括3个方面&#xff0c;即大环类药物设计、蛋白质与多肽类药物设计、核酸药物设计等&#xff0c;具体如下&…

计算机设计大赛 深度学习实现行人重识别 - python opencv yolo Reid

文章目录 0 前言1 课题背景2 效果展示3 行人检测4 行人重识别5 其他工具6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的行人重识别算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

JavaScript数据类型 检测数据类型 数据类型转换 数值相等比较

数值相等比较 JavaScript 提供三种不同的值比较运算&#xff1a; ——严格相等&#xff08;三个等号&#xff09; ——宽松相等&#xff08;两个等号&#xff09; 8种数据类型 前七种为基础数据类型。 Object类型为引用数据类型。 数据类型概念以及存储方式 let a {name:…

文本描述,简介

文章目录 需求分析要点剖析源码 需求 实现如下效果 分析 要点剖析 标题字体可以用 h1、h2、h3段落标签用 p 标签涉及到开头空两个格的使用 text-indent:2em;&#xff0c;如下&#xff1a; DIV、P标签首行缩进 <div style"text-indent:2em;">缩进的内容<…

《互联网的世界》第三讲-tcp

dns 找到了地址&#xff0c;spf 确定了路径&#xff0c;如何运输数据呢&#xff1f;今天讲 tcp。 计算机网络领域的特定技术是最后当你干这个事时才要用的&#xff0c;我对孩子们这样说&#xff0c;实际上你可以随便看一个快递单子来理解端到端传输协议。 源地址&#xff0c…

【k8s配置与存储--配置管理】

1、ConfigMap的配置 1.1 ConfigMap介绍 ConfigMap 是一种 API 对象&#xff0c;用来将非机密性的数据保存到键值对中。使用时&#xff0c; Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。 ConfigMap 将你的环境配置信息和容器镜像解耦&#xff0c;便于应用配…

GEE入门篇|图像处理(二):在Earth Engine中进行波段计算

目录 波段计算 1.NDVI的计算 2.NDVI 归一化差值的单次运算计算 3.使用 NDWI 的归一化差值 波段计算 许多指数可以使用 Earth Engine 中的波段运算来计算。 波段运算是对图像中两个或多个波段进行加、减、乘或除的过程。 在这里&#xff0c;我们将首先手动执行此操作&#x…

Day06:基础入门-抓包技术HTTPS协议APP小程序PC应用WEB转发联动

目录 HTTP/HTTPS协议抓包工具 Web浏览器抓包 APP应用抓包 WX小程序&PC应用抓包 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件上传下载…

scons,一个实用的 Python 构建工具!

目录 前言 什么是SCons库&#xff1f; 安装SCons库 使用SCons库 SCons库的功能特性 1. 基于Python的构建描述语言 2. 自动化依赖管理 3. 多种构建环境支持 SCons库的应用场景 1. C/C项目构建 2. Python项目构建 3. 嵌入式系统开发 4. 持续集成环境 5. 跨平台项目构建 总…

云服务器比价之阿里云PK腾讯云,看看哪家便宜?

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器62元一年&#xff0c;2核2G3M、2核4G、4核8G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配置价格表…

用人才测评来招聘,以及团队组建和优化

HR招聘流程&#xff1a;发布招聘信息&#xff0c;收集求职者的简历&#xff0c;筛选简历&#xff0c;线上&#xff08;人才测评&#xff09;&#xff0c;线下安排面试&#xff0c;线上&#xff08;人才测评&#xff09;&#xff0c;线下面试&#xff0c;&#xff08;线上人才测…

33-k8s项目实战-02-k8s的ca证书有效期更新

一、概述 我们知道&#xff0c;k8s各项组件之间的通信&#xff0c;都是使用https协议进行的&#xff0c;也就是ca证书&#xff0c;那么我们也知道ca证书都是有“有限期的”&#xff0c;一旦过期&#xff0c;系统就无法进行通信了&#xff1b; 这也是k8s在企业当中经常遇到的证书…