【JVM基础07】——类加载器-什么是类加载器?类加载器有哪些?双亲委派了解吗?

news2024/12/27 13:11:36

目录

  • 1- 引言:类加载器
    • 1-1 类加载器是什么?(What)
    • 1-2 为什么要用类加载器? 作用:类加载的过程?(Why)
  • 2- ⭐核心:类加载器详解(How)
    • 2-1 类加载器分类
    • 2-2 什么是双亲委派模型?
    • 2-3 为什么采用双亲委派机制?
  • 3- 小结:
    • 3-1 类加载器是什么?类加载器有哪些种类?
    • 3-2 什么是双亲委派模型?为什么采用双亲委派模型?


1- 引言:类加载器

1-1 类加载器是什么?(What)

  • 类加载器:JVM 只会运行二进制文件,类加载器的作用就是将字节码文件(.class文件)加载到JVM中,从而让 Java 程序能够启动起来。它读取二进制数据,并将这些数据转换成 java.lang.Class 类的实例。每个这样的实例用于表示 JVM 中的一个 Java 类。

image.png

1-2 为什么要用类加载器? 作用:类加载的过程?(Why)

1-加载(Loading):

  • 类加载器从各种来源(如文件系统、网络等)读取特定的类文件(.class文件),并为之创建一个java.lang.Class对象。在这个阶段,JVM会获取类的全名、类中的直接超类、是否为接口、方法、字段和常量池等基本信息。

2-验证(Verification):

  • 验证阶段确保加载的类符合JVM规范,并检查字节码文件是否未被篡改且安全无害。这一步骤包括确保格式正确,检查语义(例如,final的类没有子类),并确保字节码不包含非法数据。

3-准备(Preparation):

  • 在准备阶段,JVM为类变量分配内存,并设置默认初始值,这些变量使用的内存必须在方法区中进行分配。此阶段不包括Java代码赋予的具体值,而是系统设定的默认值(如null、0或false)。

4-解析(Resolution):

  • 解析是将类、接口、字段和方法的符号引用转换为直接引用的过程。这一步骤涉及到将在类的常量池内的符号引用替换为实际引用的具体过程。

5-初始化(Initialization):

  • 初始化是类加载过程的最后一个阶段,涉及执行类构造器<clinit>()方法的过程。此方法是由编译器自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生。这一步是执行Java程序代码初始化类变量和静态代码块。

2- ⭐核心:类加载器详解(How)

2-1 类加载器分类

①启动类加载器/引导类加载器(BootStrap ClassLoader)

  • 该类加载器是使用 C++ 语言编写的,主要是用来加载 Java 核心库的。

②扩展类加载器(ExtClassLoader)

  • 实际上是加载扩展目录的,加载 jre/lib/ext 下的扩展目录的内容

③应用类加载器(AppClassLoader)

  • 应用类加载器,AppClassLoader 主要负责加载的是 CLASSPATH 下的所有类,是 Java 默认的类加载器,负责加载开发者自己编写的 Java 类。
  • 在 Java 的日常应用开发中,类似加载基本上都是由这三种互相配合来去完成加载的,各自加载各自的类即可。

④自定义类加载器(CustomerClassLoader)

  • 自定义类加载器,实现自定义加载功能在实际的日常开发中应用的不是很多。

image.png


2-2 什么是双亲委派模型?

  • 双亲委派模型:在Java虚拟机(JVM)加载类时,它采用了一种称为双亲委派模型的机制。具体来说,当JVM需要加载一个特定的类时,当前的类加载器会首先委托其父类加载器尝试加载这个类。这个过程会一直向上递归,即每个类加载器都会先委托其父类加载器,直到达到顶层的启动类加载器。如果父类加载器能成功加载该类,则使用父类加载器的定义;如果父类加载器无法加载该类(即不在其负责的路径下找到该类的字节码),那么子加载器会尝试自己加载这个类。这种模型的主要优势在于它能够确保Java核心库的类不被自定义的类所替代,从而增强了Java应用的安全性和类的一致性。

image.png


2-3 为什么采用双亲委派机制?

  • ① 通过双亲委派机制可以避免某一个类被重复加载,当父类已经加载后则无需重复加载,保持一致性。
  • ② 为了安全,保证类库 API 不会被修改。

举例:

package java.lang;

public class String {
    public static void main(String[] args) {
        System.out.println("demo info");
    }
}

  • 执行上述代码的 main 函数,会出现异常,在类 java.lang.String 中找不到 main 方法

image.png
原因:由于是双亲委派的机制,java.lang.String 的在启动类加载器得到加载,因为在核心jre库中有其相同名字的类文件,但该类中并没有 main 方法。这样就能防止恶意篡改核心 API 库。


3- 小结:

3-1 类加载器是什么?类加载器有哪些种类?

在这里插入图片描述


3-2 什么是双亲委派模型?为什么采用双亲委派模型?

在这里插入图片描述


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

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

相关文章

开始尝试从0写一个项目--前端(三)

器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…

C#、Net6、WebApi报表方案

目录 1 Pdf表单方案 1.1出现如下错误提示: 1.2 字体路径使用 2 Docx报表模板方案 2.1 pdf方案缺陷 2.2 解决方案 3 Spire.Doc报表方案 3.1 Docx方案缺陷 3.2 解决方案 4 插入复选框 5 WebApi文件流下载接口 6 软件获取方式 1 Pdf表单方案 使用【Adobe Acrobat P…

0726,没什么用的SELECT和没用的我

目录 select 可恶&#xff01;&#xff01;&#xff01; 一对多聊天室 select&#xff1a;&#xff08;抄抄抄 最怕人类开始思考 补一对一的 select 喵&#xff1a;&#xff08;抄抄抄 &#xff1f;&#xff1f;今天就这么结束了&#xff1f;&#xff1f;&#xff1f; …

全能Ai助手:写作到设计,宝藏神器帮你事半功倍

今天&#xff0c;就让我们一起踏上这场寻找“隐藏”宝藏的旅程&#xff0c;探索这些AI工具如何改变我们的生活&#xff01; 一、高效生产力的提升之道 1. 文案创作助手 案例&#xff1a;某位自媒体博主使用了一款智能写作工具&#xff0c;不仅大大节省了写作时间&#xff0c;…

JMeter接口测试:测试中奖概率!

介绍 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试。JMeter 最初被设计用于 Web 应用测试&#xff0c;但后来扩展到了其他测试领域&#xff0c;可用于测试静态和动态资源&#xff0c;如静态文件、Java 小服务程序、CGI 脚本、J…

c语言第四天笔记

关于 混合操作&#xff0c;不同计算结果推理 第一种编译结果&#xff1a; int i 5; int sum (i) (i) 6 7 13 第二种编译结果&#xff1a; int i 5; int sum (i) (i) 6 7 7 7 前面的7是因为后面i的变化被影响后&#xff0c;重新赋值 14 第一种编译结果&#xff…

Llama + Dify,在你的电脑搭建一套AI工作流

theme: smartblue 点赞 关注 收藏 学会了 本文简介 最近字节在推Coze&#xff0c;你可以在这个平台制作知识库、制作工作流&#xff0c;生成一个具有特定领域知识的智能体。 那么&#xff0c;有没有可能在本地也部署一套这个东西呢&#xff1f;这样敏感数据就不会泄露了&…

Redis的两种持久化方式---RDB、AOF

rdb其实就是一种快照持久化的方式&#xff0c;它会将Redis在某个时间点的所有的数据状态以二进制的方式保存到硬盘上的文件当中&#xff0c;它相对于aof文件会小很多&#xff0c;因为知识某个时间点的数据&#xff0c;当然&#xff0c;这就会导致它的实时性不够高&#xff0c;如…

Scrapy 爬取旅游景点相关数据(三)

这一节我们将之前爬取到的景点数据进行解析&#xff0c;并且保存为excel&#xff0c;便于后续使用&#xff0c;本节包含 &#xff08;1&#xff09; 景点数据解析 &#xff08;2&#xff09;数据保存到excel 1 编写爬虫 这次继续改进第二节的爬虫&#xff0c;新建一个爬虫文…

C#如何引用dll动态链接库文件的注释

1、dll动态库文件项目生成属性中要勾选“XML文档文件” 注意&#xff1a;XML文件的名字切勿修改。 2、添加引用时XML文件要与DLL文件在同一个目录下。 3、如果要是添加引用的时候XML不在相同目录下&#xff0c;之后又将XML文件复制到相同的目录下&#xff0c;需要删除引用&am…

蓝桥强化宝典(3)BFS

一、定义 广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是另一种用于遍历或搜索树或图的算法。与深度优先搜索&#xff08;DFS&#xff09;沿着树的深度遍历不同&#xff0c;广度优先搜索会逐层遍历图的顶点。它从一个指定的源顶点开始&#xff0c;首先访问这…

失业潮下,有人靠天工AI做副业年入10万?

前言 你好&#xff0c;我是咪咪酱 这篇文章总结2个AI副业项目&#xff0c;不用写代码&#xff0c;就能做的2个副业项目。 第一&#xff1a;AI生成微信表情包&#xff0c;上传到微信表情包平台等&#xff0c;坚持下去&#xff0c;会有可观的收入。 第二&#xff1a;AI生成连载…

Java 8 中 20 个高频面试题及答案

文章目录 前言20 道高频题问题 1&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出列表中所有的偶数&#xff1f;问题 2&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出所有以 1 开头的数字&#xff1f;问题 3&#xff1a;如何使用 Stream 函数在给…

1.ESP32-CAM 下使用 ESP-IDF 打开摄像头

主要资料&#xff1a; 乐鑫官方编程指南 ESP-IDF 编程指南安信可官方模块页 安信可-ESP32-CAM摄像头开发板官方使用教程 安信可ESP32-CAM摄像头开发demo–局域网拍照、实时视频、人脸识别 &#xff08;开发环境是Linux&#xff09; 本文目标是在 Windows 下跑通摄像头 hello …

国衍科技——RFID技术的应用

在文物馆藏信息的记录与管理过程中&#xff0c;准确性和详细性是至关重要的。无论是大型博物馆还是私人收藏馆&#xff0c;都需要有效的方法来确保馆藏文物信息的可追溯性和可访问性&#xff0c;才能提供更好的服务和保护馆藏资源。而结合射频识别&#xff08;RFID&#xff09;…

2-46 基于matlab的声音信号的短时能量、短时过零率、端点检测

基于matlab的声音信号的短时能量、短时过零率、端点检测。通过计算计算短时能量、调整能量门限&#xff0c;然后开始端点检测。输出可视化结果。程序已调通&#xff0c;可直接运行。 2-46 短时能量 短时过零率 端点检测 - 小红书 (xiaohongshu.com)

未来的智能农业:智能合约如何提升农业生产效率和可持续性

随着全球人口的增长和资源的有限性&#xff0c;农业生产面临着越来越大的挑战。如何在提高生产效率的同时保障可持续发展成为全球农业发展的关键问题。智能合约作为一种基于区块链技术的自动化执行合约&#xff0c;正在逐渐应用于农业领域&#xff0c;为农业生产带来了新的机遇…

【MATLAB源码-第238期】基于simulink的三输出单端反激flyback仿真,通过PWM和PID控制能够得到稳定电压。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 概述 反激变换器是一种广泛应用于电源管理的拓扑结构&#xff0c;特别是在需要隔离输入和输出的应用中。它的工作原理是利用变压器的储能和释放能量来实现电压转换和隔离。该图展示了一个通过脉宽调制&#xff08;PWM&#…

C++——QT:保姆级教程,从下载到安装到用QT写出第一个程序

登录官网&#xff0c;在官网选择合适的qt版本进行下载 这里选择5.12.9版本 点击exe文件下载&#xff0c;因为服务器在国外&#xff0c;国内不支持&#xff0c;所以可以从我的网盘下载 链接: https://pan.baidu.com/s/1XMILFS1uHTenH3mH_VlPLw 提取码: 1567 --来自百度网盘超级…