来聊聊JVM中的类加载过程以及双亲委派模型(学习Java必知内容)

文章目录

  • 1. 类加载过程
    • 加载
    • 验证
    • 准备
    • 解析
    • 初始化
  • 2. 双亲委派模型
    • 一个类的加载流程
    • 双亲委派模型的优点
  • 总结


1. 类加载过程

在整个 JVM 执行过程中, 和我们程序员关系最密切的就是类加载的过程, 所以接下来我们来看下类加载的执行流程.

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

其中前 5 步是固定的顺序并且也是类加载的过程, 其中中间的 3 步我们都属于连接, 所以对于类加载来说总共分为以下几个步骤:

  1. 加载
  2. 验证
  3. 准备
  4. 解析
  5. 初始化

类加载, 是一个非常复杂的过程, 此处我们只是简单介绍一下类加载的大致流程. 细致解析需到 Java 官方文档进行查阅. 下面我们来看看每个步骤的具体执行内容.

加载

“加载”(Loading)阶段指的是整个“类加载”(Class Loading)过程中的一个阶段,在加载 Loading 阶段,Java虚拟机需要完成以下三件事情:

  1. 通过一个类的全限定名来获取定义此类的二进制字节流。
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

通俗来说, 就是找到 .class 文件, 打开文件, 读取文件内容, 并尝试解析里面的格式.

验证

验证这一阶段的目的是, 确保 .class 文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。

验证选项:

  • 文件格式验证
  • 字节码验证
  • 符号引用验证

准备

准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。最终的目标是构造出完整的类对象。

比如此时有这样一行代码:

public static int value = 123;

它在这个阶段 value 的 int 值是赋为 0,而非 123。

解析

解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。

主要是初始化类中涉及到的一些字符串常量。

初始化

初始化阶段,Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。初始化阶段就是执行类构造器方法的过程。

也就是这个环节,开始对类对象进行更具体的初始化操作。比如初始化静态成员,执行静态代码块,加载父类等等。

2. 双亲委派模型

谈到类加载机制, 不得不提的一个概念就是 “双亲委派模型”.

双亲委派模型, 可以理解为就是类加载中 JVM 如何去找 .class 文件的一个过程.

JVM 加载 .class 文件时, 会使用到 “类加载器” 模块, JVM 中自带了三个类加载器.

在这里插入图片描述

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

一个类的加载流程

在这里插入图片描述

  1. 首先, 会从 Application ClassLoader 开始. 但不会立即就搜索第三方库的目录, 而是先把加载任务委派给父类, 让父类先尝试加载.
  2. 到了 Extension ClassLoader, 也不会立即就搜索扩展库的目录, 也会把加载任务委派给父类, 也让父类尝试加载.
  3. 到了 Bootstrap ClassLoader, 也想着把任务委派出去, 可是 Bootstrap ClassLoader 已经没有父类了, 只能自己动手搜索类了. 如果找到了这个类, 就会进行后续的加载. 如果没找到这个类, 就会将这个任务交回给子类加载器去完成.
  4. 任务回到了 Extension ClassLoader, 此时收到父类交回的任务后, 就会开始搜索扩展库的目录, 看看有没有匹配的 .class 文件. 如果找到了这个类, 就会进行后续的加载. 如果没找到这个类, 就会将这个任务交回给子类加载器去完成.
  5. 任务回到 Application ClassLoader, 此时就会开始搜索第三方库的目录(往往是自己开发时的项目目录), 如果找到了这个类, 就会进行后续的加载. 如果没找到这个类, 这时就会抛出异常.

双亲委派模型的优点

  1. 避免重复加载类:比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进行加载时就不需要在重复加载 C 类了。
  2. 安全性:使用双亲委派模型也可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object 类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类,而有些 Object 类又是用户自己提供的因此安全性就不能得到保证了。

总结

✨ 本文主要讲解了 JVM 中的类加载过程, 以及其中涉及到的双亲委派模型, 是我们学习 Java 过程中, 需要着重了解的.
✨ 想了解更多知识, 请持续关注博主, 本人会不断更新学习记录, 跟随我一起不断学习.
✨ 感谢你们的耐心阅读, 博主本人也是一名学生, 也还有需要很多学习的东西. 写这篇文章是以本人所学内容为基础, 日后也会不断更新自己的学习记录, 我们一起努力进步, 变得优秀, 小小菜鸟, 也能有大大梦想, 关注我, 一起学习.

再次感谢你们的阅读, 你们的鼓励是我创作的最大动力!!!!!

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

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

相关文章

洛谷P1219 [USACO1.5] 八皇后【n皇后问题】【深搜+回溯 经典题】【附O(1)方法】

P1219 [USACO1.5] 八皇后 Checker Challenge 前言题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示题目分析注意事项 代码深搜回溯打表 后话额外测试用例样例输入 #2样例输出 #2 王婆卖瓜 题目来源 前言 也是说到做到,来做搜索的题(虽…

外汇天眼:外汇市场中的点差是什么? 又该怎么计算呢?

今天为大家揭开外汇点差的神秘面纱,了解这一外汇交易的核心概念。 定义 外汇点差,简单来说,就是外汇市场上买卖双方报价的差异。 每一笔交易由买卖报价中高低不同的部分构成,高出的部分是买方的盈利,低出的部分则是卖…

一文掌握 Spring Boot 常用注解,保姆级整理,建议收藏!

亲兄弟篇: SpringBoot注解大全(超详细)_Maiko Star的博客-CSDN博客 一、SpringBoot常用注解 二、Bean处理注解 2.1 Resource 依赖注入,自动导入标注的对象到当前类中,比如我们的 Controller 类通常要导入 Service 类…

【Unity】EventSystem.current.IsPointerOverGameObject()对碰撞体起作用

本来我是用 EventSystem.current.IsPointerOverGameObject()来检测是否点击在UI上的,但是发现,他对我的碰撞体也是返回ture,研究半天。。。。找不出问题,然后发现我的相机上挂载了PhysicsRaycaster,去掉之后就好了,至于…

王道操作系统大题汇总(纯手写版,思路过程详细)

文章目录 前言:一、计算机系统概述二、进程与线程三、内存管理四、文件管理五、输入/输出(I/0)管理 前言: 本文为笔者自用操作系统大题复习,大家可以作为学习的参考,文章只收录操作系统常考大题&#xff0…

Django之cookie和session

文章目录 Cookie的介绍Cookie的由来什么是CookieCookie原理Cookie覆盖浏览器查看Cookie 在Django中操作Cookie设置Cookie查询浏览器携带的Cookie删除Cookie Cookie校验登录sessionSession的由来Session设置查看、更新Session值删除Session值Seesion的其他方法Session的其他配置…

安全牛《数据分类分级自动化建设指南》发布|美创入选代表厂商,分享智能化探索

近日,安全牛发布《数据分类分级自动化建设指南》研究报告,对数据分类分级的主要技术、实施要点、选型指导、发展趋势等展开深入探讨,为各行业数据分类分级自动化工作落地提供帮助与指引。 美创科技被列为代表推荐厂商,落地案例—农…

C++初阶 | [五] 内存管理

摘要:new and delete,定位new,(C内存管理的方式),malloc/free和new/delete的区别,内存泄漏 关于内存: 栈又叫堆栈——非静态局部变量/函数参数/返回值等等,栈是向下增长…

JAVA爬虫2 - Jsoup解析、对接MySQL、多线程爬虫、json库使用

官网:https://jsoup.org/download Jsoup是一款基于Java的HTML解析器,它可以方便地从网页中抓取和解析数据。它的主要作用是帮助开 发者处理HTML文档,提取所需的数据或信息。下面介绍几个常用的API: 选择器(Selector)API:用于根据CSS选择器语法选择HTML元素。 属性(Attribute…

深入了解前馈网络、CNN、RNN 和 Hugging Face 的 Transformer 技术!

一、说明 本篇在此对自然语言模型做一个简短总结,从CNN\RNN\变形金刚,和抱脸的变形金刚库说起。 二、基本前馈神经网络: 让我们分解一个基本的前馈神经网络,也称为多层感知器(MLP)。此代码示例将&#xff1…

Docker | Docker入门安装

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Docker系列 ✨特色专栏: My…

STM32-SPI协议详解及CubeMX+HAL函数配置分析

1 SPI协议 SPI(Serial Peripheral interface)串行外围设备接口是同步全双工的通信总线,在芯片的管脚上只占用四根线。 1.1 物理层 SS/NSS/CS:从设备选择信号线(片选信号线)。由主设备控制,选择指定的从设备。 当主机要选择从设备时,把该从设备的SS信号线设置为低电平…

再探MDG cloud-ready模式!看未来MDG的发展路线

紧跟上一篇博客,我们将更加深入探讨一些MDG Cloud-Ready模式的相关内容。 背景 在2021年9月,Harald Kuck,SAP ABAP Platform老大,介绍了未来ABAP的发展路线,并最终在一年后正式推出了ABAP Cloud。他在会上是这么说的…

指针操作一维数组和二维数组的理解!

指针操作一维数组和二维数组的理解! 一维数组二维数组 一维数组 你虽然觉得指针操作一维数组很简单,但是通过做题发现并没有那么简单,特别是二维数组!!!   int main() {//创建一维数组int arr[10] { 0,1…

可以在uni-app使用的类vconsole.js插件

兴致勃勃在uni-app项目引入调试工具vconsole.js结果真机调试页面空白 怎么办?! 别着急 paradox老师有方法 替代插件下载地址:直接下载插件并引入HbuilderXuni_modules插件 - 类Vconsole APP端调试工具 - HF调试器 - DCloud 插件市场 下载完成在main.js中引入&…

这样写Allure生成测试报告,学会直接涨薪5k

Allure是一个开源的测试报告生成框架,提供了测试报告定制化功能,相较于我们之前使用过pytest-html插件生成的html格式的测试报告,通过Allure生成的报告更加规范、清晰、美观。 pytest框架支持使用Allure生成测试报告,接下来让介绍…

机器学习算法——聚类算法

目录 1. 概述2. K-MEANS算法2.1 工作流程2.2 代码实践 1. 概述 聚类算法是一种无监督学习方法,用于将数据集中的对象分组或聚集成具有相似特征的集合,该集合被称为簇(cluster)。聚类算法通过计算数据点之间的相似性或距离,将相似的数据点归为…

企业建数仓的第一步是选择一个好用的ETL工具

当企业决定建立数据仓库(Data Warehouse),第一步就是选择一款优秀的ETL(Extract, Transform, Load)工具。数据仓库是企业数据管理的核心,它存储、整合并管理各种数据,为商业决策和数据分析提供支…

java中BigDecimal的介绍及使用(二)

系列文章目录 java中BigDecimal的介绍及使用,BigDecimal格式化,BigDecimal常见问题java中BigDecimal的介绍及使用(二) 文章目录 系列文章目录一、前言二、BigDecimal提供的方法2.1、stripTrailingZeros() 去除小数尾部所有的02.2、int signum()2.3、int…

python爬虫中 HTTP 到 HTTPS 的自动转换

前言 在当今互联网世界中,随着网络安全的重要性日益增加,越来越多的网站采用了 HTTPS 协议来保护用户数据的安全。然而,许多网站仍然支持 HTTP 协议,这就给我们的网络爬虫项目带来了一些挑战。为了应对这种情况,我们需…