类加载的基本流程

⭐ 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏: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 类⼜是⽤⼾⾃⼰提供的因此安全性就不能得到保证了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

maven项目报错Cannot resolve plugin org.apache.maven.plugins:maven-war-plugin:2.2

如果IDEA整合maven没有问题,还是报这个错误,很大可能是由于在下载过程中存在网络问题,导致文件下载一半而停止,但是已经在仓库中存在这个文件夹,解决方法是删除文件夹重新下载即可。 删除本地仓库下的\org\apache\mav…

Gophish+EwoMail 自建钓鱼服务器

GophishEwoMail 自建钓鱼服务器 文章目录 GophishEwoMail 自建钓鱼服务器1.前提准备2.搭建EwoMail邮件服务器1)Centos7 防火墙操作2)设置主机名3)host配置4)安装EwoMail5)获取DKIM6)端口服务介绍7&#xff…

JAVA的学习日记

JAVA的学习日记(2024.3.1)(b站韩顺平老师课程学习笔记版) ps:捡起忘光光的Java语言 Sublime //1. public是公有,class是类 //2. public class Hello表示Hello是一个类,是一个public公有的类 //3. Hello{…

1.1 创建第一个vue项目

cmd命令窗口运行 vue init webpack hellovue 注意,hellovue是项目名称,项目名称不能保存大写字母否者会报错 Sorry, name can no longer contain capital letters. 运行设个命令的时候可能会报错,根据提示先运行 npm i -g vue/cli-init …

在独立Unity工程中集成Vortex Studio

本文首发于:Unity3D入门教程09.01:在独立Unity工程中集成Vortex Studio 目的 在Unity中使用Vortex Studio引擎模拟Unity场景中的任何资源。 工程 打开桌面Unity Hub快捷方式 点击Open选择需要打开的工程,这里选择官方提供的默认工程C:\CM…

永磁同步电机无感FOC(龙伯格观测器)算法技术总结-实战篇

文章目录 1、ST龙伯格算法分析(定点数)1.1 符号说明1.2 最大感应电动势计算1.3 系数计算1.4 龙伯格观测器计算1.5 锁相环计算1.6 观测器增益计算1.7 锁相环PI计算(ST)1.8 平均速度的用意 2、启动策略2.1 V/F压频比控制2.2 I/F压频…

msvcp140.dll安装教程_最新msvcp140.dll丢失的解决方法

msvcp140.dll 是一个动态链接库 (DLL) 文件,它是 Microsoft Visual C 运行时库的一部分,特别对应的是 Visual Studio 2015 版本编译的 C 应用程序所需的关键组件。DLL 文件的设计目的是为了实现代码和数据的共享,这样多个应用程序就可以在同一…

C# 解决uploadify插件上传时造成session丢失问题

出现的问题: 在应用uploadify插件实现上传图片时,报了HTTP Error,经过在Network查看上传方法报错码是302,那这里就可以知道问题是什么了,HTTP 302是请求被重定向,如果你的uploadify处理上传方法有session验…

Vue3_2024_1天【Vue3创建和响应式,对比Vue2】

前言: Vue3对比Vue2版本,它在性能、功能、易用性和可维护性方面都有显著的提升和改进。 性能优化:模板编译器的优化、对Proxy的支持以及使用了更加高效的Virtual DOM算法等。这使得Vue3的打包大小减少了41%,初次渲染提速55%&#…

【K8S类型系统】一文梳理 K8S 各类型概念之间的关系(GVK/GVR/Object/Schema/RestMapper)

参考 k8s 官方文档 https://kubernetes.io/zh-cn/docs/reference/https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.29/ 重点 Kubernetes源码学习-kubernetes基础数据结构 - 知乎 重点 Kubernetes类型系统 | 李乾坤的博客 重点 k8s源码学习-三大核心数…

Harbor 的安装及使用

Harbor 安装官网手册: https://goharbor.io/docs/2.10.0/install-config/download-installer/ Harbor 发布包地址: https://github.com/goharbor/harbor/releases Harbor 的架构查看: https://github.com/goharbor/harbor/wiki/Architectur…

​MPV,汽车产品里一个特殊品类的进化过程

「汽车」可能是整个工业革命以来,所诞生出的最有趣的工业产品。 它不仅能产生工业的机械美,还诞生了一个独立的文化体系,在汽车的发展过程中,我们也能看到一些本来应功能而诞生的产品,最终走向了千家万户。 MPV 就是…

如何设置从小程序跳转到其它小程序

​有的商家有多个小程序,希望能够通过一个小程序链接到所有其它小程序,用户可以通过点击跳转链接实现从一个小程序跳转到另一个小程序。要怎么才能实现这样的跳转呢。下面具体介绍。 1. 设置跳转。在小程序管理员后台->分类管理,添加一个…

js截取图片地址后面的参数和在路径中截取文件名或后缀名

文章目录 前言截取地址 ?后面的参数在路径中截取文件名或后缀名总结 前言 在处理网页上的图片资源或者其他类型的文件资源时,你可能会遇到需要使用这些技巧的情况。以下是一些具体的使用场景: 动态修改图片参数:如果你有一个图片U…

社交APP开发能给用户带来什么

现在的社交软件也非常的多,每款社交软件都有自己的特色,社交软件是日常中必备的软件,不管是生活交流还是感情工作交流都是比较方便的,因为社交软件满足了日常的远程交流问题,所以开发社交软件也会逐渐的流行起来的。 …

LeetCode240题:搜索二维矩阵II(python3)

代码思路: “根节点” 对应的是矩阵的 “左下角” 和 “右上角” 元素,以 matrix 中的左下角元素为标志数 flag ,则有: 若 flag > target ,则 target 一定在 flag 所在行的上方 ,即 flag 所在行可被消去&#xff0c…

NLP - 神经网络与反向传播

使用神经网络进行命名实体识别(二值词窗分类) 根据上下文窗口 建立词向量 通过一个神经网络层,通过一个逻辑分类器,得到这个概率是属于特定实体词的预测概率。 另一个分类器来比较说明 这个词是哪个实体类型(比较概率…

基于Python3的数据结构与算法 - 07 归并排序

一、归并 引入 假设现在的列表分两段有序,如何将其合并成为一个有序列表。 这种操作成为一次归并。 归并的思路 分别对两个列表进行遍历,比较两个列表中的最小值,将更小的取出来。取出后一次进行上操作,直到其中一个列表中的元…

Servlet 新手村引入-编写一个简单的servlet项目

Servlet 新手村引入-编写一个简单的servlet项目 文章目录 Servlet 新手村引入-编写一个简单的servlet项目一、编写一个 Hello world 项目1.创建项目2.引入依赖3.手动创建一些必要的目录/文件4.编写代码5.打包程序6.部署7.验证程序 二、更方便的处理方案(插件引入&am…

vue3编写H5适配横竖屏

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