大白话解释什么类加载机制

news/2024/11/25 21:35:45/

大家好,我是伍六七。

今天我们来聊聊一个 Java 面试必考基础题目:类加载机制和双亲委派机制。

Java 类的加载机制是 Java 虚拟机(JVM)中类加载(Class Loading)和链接(Linking)的过程的一部分。这个过程遵循以下步骤:

1、加载(Loading): 这是第一步,其中 JVM 会通过类的全名找到这个类的二进制数据流,并从这个数据流中构造出一个 Class 对象。

2、链接(Linking): 链接过程包含验证(Verify)、准备(Prepare)和解析(Resolve)三个阶段。

  • 验证: 确保被加载的类符合 JVM 规范。
  • 准备: 为类的静态变量分配内存,并将其初始化为默认值。
  • 解析: 虚拟机将类中的符号引用转换为直接引用。

3、初始化(Initialization): 这个阶段是执行类构造器 <clinit>() 方法的过程,这个方法由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的。

Java 类加载机制的核心是双亲委派模型

在这个模型中,一个类加载器在加载类时,首先会请求其父类加载器加载该类,依此类推,直到顶层的启动类加载器。如果父类加载器无法完成这个加载任务(即它没有找到对应的类),子类加载器才会尝试自己去加载这个类。

这句话,我们经常看到,那什么意思呢?用大白话告诉你:

我们需要知道,默认情况,Java 提供了以下三类类加载器:

1、启动类加载器(Bootstrap ClassLoader):

这是类加载器层级结构中的最顶层加载器。
它负责加载 JVM 的核心类库,如 java.lang.*。

2、扩展类加载器(Extension ClassLoader):

它是启动类加载器的子类。
负责加载 Java 的扩展类库,这些类库通常位于 jre/lib/ext 目录或由系统属性 java.ext.dirs 指定的任何其他目录中。

3、应用程序类加载器(Application ClassLoader):

这是扩展类加载器的子类。

它负责加载环境变量 classpath 或系统属性 java.class.path 指定路径中的类。

这种机制有助于防止类的重复加载,并保证了 Java 核心库的类型安全。

详细解释具体流程

1、类加载请求的初始处理

当一个类加载器(比如应用程序类加载器)接收到一个请求,用来加载一个特定的类时,它并不会立即尝试去加载这个类

2、委派给父类加载器

代替自行加载,这个类加载器会将加载请求向上委派给它的父类加载器。例如,应用程序类加载器会先将请求委派给扩展类加载器,扩展类加载器再将请求委派给启动类加载器

3、父类加载器的处理

父类加载器(在这个例子中是启动类加载器)会尝试加载这个类。启动类加载器主要负责加载 Java 的核心类库(例如 java.lang.*)。

如果它能够找到并加载这个类,那么加载过程到此结束,子类加载器不会再进行任何操作。

4、父类加载器无法加载时的回退

如果父类加载器(比如启动类加载器)无法加载该类(通常是因为它在其搜索路径下没有找到相应的类),那么它会将请求回退给请求它的子类加载器(在这个例子中是扩展类加载器)。

接着,扩展类加载器会尝试自己去加载这个类。如果扩展类加载器也无法加载这个类,同样的过程会发生在它和它的子类加载器(应用程序类加载器)之间。

5、保障类加载的有序性和安全性

这种委派机制确保了 Java 核心类库的类型不会被随意替换,因为自定义的类加载器无法替换那些由启动类加载器加载的核心类库

同时,它也避免了类的重复加载,因为在尝试自行加载类之前,每个类加载器都会先检查它的父类加载器是否已经加载了该类。

通过这种方式,双亲委派模型为 Java 类的加载提供了一种层次化和有序的方法,保证了类加载机制的健壯性和安全性。

扫描下面二维码,加我好友,一起交流技术。

学会了嘛?学会了帮我点一下在看或转发,欢迎关注我的公众号

关注我,送你全套我整理的 Java 岗位面试资料。这是我自己之前整理的面试题,靠着这份面试题,我从 30 人的小公司,进了 2000 人+的央企子公司,之后又进了互联网大厂。

一份让我进大厂&央企的面试题


http://www.ppmy.cn/news/1228961.html

相关文章

pytest测试框架介绍(1)

又来每天进步一点点啦~~~ 一、Pytest介绍&#xff1a; pytest 是一个非常成熟的全功能的Python测试框架&#xff1b; pytest 简单、灵活、易上手&#xff1b; 支持参数化 能够支持简单的单元测试和复杂的功能测试&#xff0c;可以做接口自动化测试&#xff08;pytestrequests&…

穷举法、回溯法、分支界限法解决旅行商(TSP)问题

文章目录 一、问题描述二、穷举法解决2.1 介绍2.2 代码 三、回溯法解决四、分支界限法4.1 介绍4.2 代码 一、问题描述 有一个旅行商由某城市出发&#xff0c;经过所有给定的 n n n 个城市后&#xff0c;再回到出发的城市。除了出发的城市外&#xff0c;其它城市只经过一回。这…

在bootstrap中,能不能对同一个容器,既使用类row进行网格设计,又使用类d-flex实现弹性盒子的性能?

问&#xff1a;在bootstrap中&#xff0c;能不能对同一个容器&#xff0c;既使用类row进行网格设计&#xff0c;又使用类d-flex实现弹性盒子的性能&#xff1f; 是的&#xff0c;你可以在Bootstrap中同时使用row类进行网格设计和d-flex类实现弹性盒子。这两个类可以结合使用&a…

asp.net校园二手交易平台系统VS开发sqlserver数据库web结构c#编程计算机网页

一、源码特点 asp.net校园二手交易平台系统 是一套完善的web设计管理系统&#xff0c;系统采用mvc模式&#xff08;BLLDALENTITY&#xff09;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 vs2010&#xff0c;数据库为sqlserver2008&a…

Verilog基础:仿真时x信号的产生和x信号对于各运算符的特性

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 信号爆x也许是所有IC人的噩梦&#xff0c;满屏的红色波形常让人头疼不已&#xff0c;但x信号的产生原因却常常只有几种&#xff0c;只要遵循一定的代码规范&#…

Docker基础知识总结

文章目录 1.Docker介绍2.Docker版本3.为什么要使用Docker4.Docker基础组件4.1 镜像&#xff08;Images&#xff09;4.2 容器&#xff08;Container&#xff09;和仓库&#xff08;Repository&#xff09; 5.Docker安装6.Docker run7.Dockerfile8.Docker commit9.镜像发布到镜像…

C++不同类型转换

内置类型的转换&#xff1a; 内置类型之间的转换之前提过。相同类型的赋值直接进行&#xff0c;但不同类型之间的赋值系统会将将其转换成临时变量&#xff0c;这个临时变量具有常性&#xff0c;然后再将这个临时变量进行赋值&#xff0c;这里就不做代码演示了。自定义类型转换为…

【C#】字符串拼接相关

目录 1.字符串拼接方式1 用号进行字符串拼接 复合运算符 2.字符串拼接方式2 3.控制台打印拼 4.例子 1.字符串拼接方式1 之前的算数运算符 只是用来数值类型变量进行数学运算的而 string 不存在算数运算符 不能计算 但是可以通过号来进行字符串拼接 用号进行字符串拼接 …