类加载的过程以及双亲委派模型

  类加载,指的是java进程运行的时候,需要把.class文件从硬盘,读取到内存,并进行一系列的校验解析的过程。(.class文件 => 类对象,硬盘 => 内存)

  类加载的过程,类加载的过程其实是在java官方文档中给出的说明(Java 官方文档)

1. 类加载的过程(可以分为五个步骤)

 

1. 加载:把硬盘上的.class文件,找到打开文件,读取到文件内容(认为读到的是二进制的数据)

2. 验证:当前需要确保读到的文件的内容,是合法的.class文件(字节码文件)格式。(具体的验证依据,在Java的虚拟机规范中,有明确的格式说明)。 

3. 准备:给类对象,申请内存空间。(此时申请到的内存空间,里面的默认值,都是全是0的。这个阶段中,类对象里的静态成员变量的值也就相当于是0了)。

4. 解析:主要是针对类中的字符串常量进行处理。(解析阶段是Java虚拟机常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。)

5. 初始化:针对类对象完成后续的初始化 。(还要执行静态的代码块的逻辑,还可能会触发父类的加载)

2. 双亲委派模型

  简单来说,描述了如何查找.class文件的策略。JVM中进行类加载的操作,是有一个专门的模块,称为“类加载器”(ClassLoader),JVM中的类加器默认是有三个。(也可以自定义的)

 

1. BootstrapClassLoader: 负责查找标准库的目录。

2. ExtensionClassLoader:负责查找扩展库的目录。

3. ApplicationClassLoader:负责查找当前项目的代码目录,以及第三方库的目录。

  小结:上述的三个类加载器,存在“父子关系”(不是 面向对象中的,父类 子类继承关系,而是类似于“二叉树”,有一个指针(引用)parent,指向自己的“父”类加载器)

 

 双亲委派模型工作过程: 

1. 从ApplicationClassLoader作为入口,先开始工作。

2. ApplicationClassLoader 不会立即搜索自己负责的目录,会把搜索的任务交给自己的父亲。

3. 代码就进入到ExtensionClassLoader范畴了,ExtensionClassLoader也不会立即搜索自己负责的目录也要把搜素的任务交给自己的父亲。

4. 代码就进入到BootstrapClassLoader范畴了,BootstrapClassLoader也不想立即搜索自己负责的目录,也要把搜索的任务交给自己的父亲。

5. BootstrapClassLoader发现自己没有父亲,才会真正搜索负责的目录(标准库目录)通过全限定类名,尝试在标准库目录中找到符合要求的.class文件。如果找到了,接下来就直接进入到打开文件/读取文件等流程中。如果没找到,回到孩子这一辈的类加载器中,继续尝试加载。

6. ExtensionClassLoader收到父亲交给回他的任务之后,自己进行搜索负责目录(扩展库的目录)。如果找到了,接下来就直接进入到打开文件/读取文件等流程中。如果没找到,回到孩子这一辈的类加载器中,继续尝试加载。

7. ApplicationClassLoader 收到父亲交回给他的任务之后,自己进行搜索负责的目录(当前项目目录/第三方库目录)如果找到了,接下来就直接进入到打开文件/读取文件等流程中。如果没找到,回到孩子这一辈的类加载器中,继续尝试加载。由于默认情况下ApplicationClassLoader没有孩子了,此时说明类加载过程失败了!就会抛出ClassNotFoundExeception异常。

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

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

相关文章

【Leetcode每日一刷】贪心算法|122.买卖股票的最佳时机 II、55. 跳跃游戏

一、122.买卖股票的最佳时机 II 力扣题目链接 🦄解题思路: 首先需要明确的几个点: 当前只能有最大一支股票每一天操作只能3选1:买or卖or休息 此外,对于贪心,总有像下面图示的一种直觉:如果…

2024年3月2日 十二生肖 今日运势

小运播报:2024年3月2日,星期六,农历正月廿二 (甲辰年丙寅月乙丑日),法定节假日。 红榜生肖:鸡、蛇、鼠 需要注意:狗、马、羊 喜神方位:西北方 财神方位:东…

bert 相似度任务训练,简单版本

目录 任务 代码 train.py predit.py 数据 任务 使用 bert-base-chinese 训练相似度任务,参考:微调BERT模型实现相似性判断 - 知乎 参考他上面代码,他使用的是 BertForNextSentencePrediction 模型,BertForNextSentencePred…

AI也来打掼蛋,难道人工智能也能当领导?

引言:探索AI在复杂卡牌游戏中的决策能力 在人工智能(AI)的研究领域中,游戏被视为现实世界的简化模型,常常是研究的首选平台。这些研究主要关注游戏代理的决策过程。例如,中国的传统卡牌游戏“掼蛋”&#…

Windows Docker 部署 Jenkins

一、简介 今天介绍一下在 Windows Docker 中部署 Jenkins 软件。在 Windows Docker 中,分为两种情况 Linux 容器和 Windows 容器。Linux 容器是通常大多数使用的方式,Windows 容器用于 CI/CD 依赖 Windows 环境的情况。 二、Linux 容器 Linux 容器内部…

LeetCode -- 79.单词搜索

1. 问题描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水…

【前沿热点视觉算法|Sora|GPT4一键升级】一种新的图像分割方法:具有边界注意的两级解码网络

计算机视觉算法分享。问题或建议,请文章私信或者文章末尾扫码加微信留言。sora 具体介绍和使用方法:OpenAI Sora 下一代生产力:最新小白必看教程 | 解剖Sora的前世今生 | Sora核心源码目前 openai 官方还未开放 sora 灰度,不过根据…

黑马JavaWeb课程中安装vue脚手架出现的问题

1 安装node.js 要想前端工程化,必须安装node.js,前端工程化的环境。 在成功安装node.js后, 修改全局包安装路径为Node.js安装目录, 修改npm镜像源为淘宝镜像源,这里出现第一个问题,视频中给的淘宝镜像为&…

抽象类、模板方法模式

抽象类概述 在Java中abstract是抽象的意思,如果一个类中的某个方法的具体实现不能确定,就可以申明成abstract修饰的抽象方法(不能写方法体了),这个类必须用abstract修饰,被称为抽象类。 抽象方法定义&…

WSL2编译RV1126 SDK

接上一篇《WSL2部署RV1126 SDK编译环境》 1 编译配置 ./build.sh device/rockchip/rv1126_rv1109/aio-rv1126-jd4.mk 2 关闭Qt(可选) vim buildroot/configs/firefly_rv1126_rv1109_defconfig 3 启用ROS(可选) vim buildroot/conf…

链表基础知识详解(非常详细简单易懂)

概述: 链表作为 C 语言中一种基础的数据结构,在平时写程序的时候用的并不多,但在操作系统里面使用的非常多。不管是RTOS还是Linux等使用非常广泛,所以必须要搞懂链表,链表分为单向链表和双向链表,单向链表很…

Rocky Linux 安装部署 Zabbix 6.4

一、Zabbix的简介 Zabbix是一种开源的企业级监控解决方案,用于实时监测服务器、网络设备和应用程序的性能和可用性。它提供了强大的数据收集、处理和可视化功能,同时支持事件触发、报警通知和自动化任务等功能。Zabbix易于安装和配置,支持跨平…