当前位置:首页 > 科技  > 软件

什么是类加载器?什么是双亲委派模型?

来源: 责编: 时间:2023-12-06 17:13:34 254观看
导读图片一. 什么是类加载器,类加载器有哪些?要想理解类加载器的话,务必要先清楚对于一个Java文件,它从编译到执行的整个过程。图片类加载器:用于装载字节码文件(.class文件)运行时数据区:用于分配存储空间执行引擎:执行字节码

Fdm28资讯网——每日最新资讯28at.com

图片图片Fdm28资讯网——每日最新资讯28at.com

一. 什么是类加载器,类加载器有哪些?

要想理解类加载器的话,务必要先清楚对于一个Java文件,它从编译到执行的整个过程。Fdm28资讯网——每日最新资讯28at.com

图片图片Fdm28资讯网——每日最新资讯28at.com

  • 类加载器:用于装载字节码文件(.class文件)
  • 运行时数据区:用于分配存储空间
  • 执行引擎:执行字节码文件或本地方法
  • 垃圾回收器:用于对JVM中的垃圾内容进行回收

1.1. 类加载器

JVM只会运行二进制文件,而类加载器(ClassLoader)的主要作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。现有的类加载器基本上都是java.lang.ClassLoader的子类,该类的只要职责就是用于将指定的类找到或生成对应的字节码文件,同时类加载器还会负责加载程序所需要的资源Fdm28资讯网——每日最新资讯28at.com

1.2. 类加载器种类

类加载器根据各自加载范围的不同,划分为四种类加载器:Fdm28资讯网——每日最新资讯28at.com

  • 启动类加载器(BootStrap ClassLoader):该类并不继承ClassLoader类,其是由C++编写实现。用于加载JAVA_HOME/jre/lib目录下的类库。
  • 扩展类加载器(ExtClassLoader):该类是ClassLoader的子类,主要加载JAVA_HOME/jre/lib/ext目录中的类库。
  • 应用类加载器(AppClassLoader):该类是ClassLoader的子类,主要用于加载classPath下的类,也就是加载开发者自己编写的Java类。
  • 自定义类加载器:开发者自定义类继承ClassLoader,实现自定义类加载规则。

上述三种类加载器的层次结构如下如下:Fdm28资讯网——每日最新资讯28at.com

图片图片Fdm28资讯网——每日最新资讯28at.com

类加载器的体系并不是“继承”体系,而是委派体系,类加载器首先会到自己的parent中查找类或者资源,如果找不到才会到自己本地查找。类加载器的委托行为动机是为了避免相同的类被加载多次。Fdm28资讯网——每日最新资讯28at.com

二. 什么是双亲委派模型?

如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就返回成功;只有父类加载器无法完成此加载任务时,才由下一级去加载。Fdm28资讯网——每日最新资讯28at.com

图片图片Fdm28资讯网——每日最新资讯28at.com

三. JVM为什么采用双亲委派机制

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

在工程中新建java.lang包,接着在该包下新建String类,并定义main函数Fdm28资讯网——每日最新资讯28at.com

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

此时执行main函数,会出现异常,在类 java.lang.String 中找不到 main 方法Fdm28资讯网——每日最新资讯28at.com

图片图片Fdm28资讯网——每日最新资讯28at.com

出现该信息是因为由双亲委派的机制,java.lang.String的在启动类加载器(Bootstrap classLoader)得到加载,因为在核心jre库中有其相同名字的类文件,但该类中并没有main方法。这样就能防止恶意篡改核心API库。Fdm28资讯网——每日最新资讯28at.com

四. 类装载的执行过程?

类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三个部分统称为连接(linking)。Fdm28资讯网——每日最新资讯28at.com

图片图片Fdm28资讯网——每日最新资讯28at.com

类加载过程详解

1.加载

图片图片Fdm28资讯网——每日最新资讯28at.com

  • 通过类的全名,获取类的二进制数据流。
  • 解析类的二进制数据流为方法区内的数据结构(Java类模型)
  • 创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口

图片图片Fdm28资讯网——每日最新资讯28at.com

2.验证

图片图片Fdm28资讯网——每日最新资讯28at.com

验证类是否符合JVM规范,安全性检查Fdm28资讯网——每日最新资讯28at.com

(1)文件格式验证:是否符合Class文件的规范Fdm28资讯网——每日最新资讯28at.com

(2)元数据验证Fdm28资讯网——每日最新资讯28at.com

  • 这个类是否有父类(除了Object这个类之外,其余的类都应该有父类)
  • 这个类是否继承(extends)了被final修饰过的类(被final修饰过的类表示类不能被继承)
  • 类中的字段、方法是否与父类产生矛盾。(被final修饰过的方法或字段是不能覆盖的)

(3)字节码验证- 主要的目的是通过对数据流和控制流的分析,确定程序语义是合法的、符合逻辑的。Fdm28资讯网——每日最新资讯28at.com

(4)符号引用验证:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量Fdm28资讯网——每日最新资讯28at.com

比如:int i = 3; 字面量:3 符号引用:iFdm28资讯网——每日最新资讯28at.com

3.准备

图片图片Fdm28资讯网——每日最新资讯28at.com

为类变量分配内存并设置类变量初始值

  • static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成
  • static变量是final的基本类型,以及字符串常量,值已确定,赋值在准备阶段完成
  • static变量是final的引用类型,那么赋值也会在初始化阶段完成

图片图片Fdm28资讯网——每日最新资讯28at.com

4.解析

图片图片Fdm28资讯网——每日最新资讯28at.com

把类中的符号引用转换为直接引用

比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法。Fdm28资讯网——每日最新资讯28at.com

图片图片Fdm28资讯网——每日最新资讯28at.com

5.初始化

图片图片Fdm28资讯网——每日最新资讯28at.com

对类的静态变量,静态代码块执行初始化操作Fdm28资讯网——每日最新资讯28at.com

  • 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
  • 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

6.使用

图片图片Fdm28资讯网——每日最新资讯28at.com

JVM 开始从入口方法开始执行用户的程序代码Fdm28资讯网——每日最新资讯28at.com

  • 调用静态类成员信息(比如:静态字段、静态方法)
  • 使用new关键字为其创建对象实例

7.卸载

当用户程序代码执行完毕后,JVM 便开始销毁创建的 Class 对象,最后负责运行的 JVM 也退出内存Fdm28资讯网——每日最新资讯28at.com

五.类加载器面试

面试官:什么是类加载器,类加载器有哪些?Fdm28资讯网——每日最新资讯28at.com

候选人:Fdm28资讯网——每日最新资讯28at.com

JVM只会运行二进制文件,而类加载器(ClassLoader)的主要作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。Fdm28资讯网——每日最新资讯28at.com

常见的类加载器有4个Fdm28资讯网——每日最新资讯28at.com

第一个是**启动类加载器(BootStrap ClassLoader)**:其是由C++编写实现。用于加载JAVA_HOME/jre/lib目录下的类库。Fdm28资讯网——每日最新资讯28at.com

第二个是**扩展类加载器(ExtClassLoader)**:该类是ClassLoader的子类,主要加载JAVA_HOME/jre/lib/ext目录中的类库。Fdm28资讯网——每日最新资讯28at.com

第三个是**应用类加载器(AppClassLoader)**:该类是ClassLoader的子类,主要用于加载classPath下的类,也就是加载开发者自己编写的Java类。Fdm28资讯网——每日最新资讯28at.com

第四个是自定义类加载器:开发者自定义类继承ClassLoader,实现自定义类加载规则。Fdm28资讯网——每日最新资讯28at.com

面试官:说一下类装载的执行过程?Fdm28资讯网——每日最新资讯28at.com

候选人:Fdm28资讯网——每日最新资讯28at.com

类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三个部分统称为连接(linking)Fdm28资讯网——每日最新资讯28at.com

1.加载:查找和导入class文件Fdm28资讯网——每日最新资讯28at.com

2.验证:保证加载类的准确性Fdm28资讯网——每日最新资讯28at.com

3.准备:为类变量分配内存并设置类变量初始值Fdm28资讯网——每日最新资讯28at.com

4.解析:把类中的符号引用转换为直接引用Fdm28资讯网——每日最新资讯28at.com

5.初始化:对类的静态变量,静态代码块执行初始化操作Fdm28资讯网——每日最新资讯28at.com

6.使用:JVM 开始从入口方法开始执行用户的程序代码Fdm28资讯网——每日最新资讯28at.com

7.卸载:当用户程序代码执行完毕后,JVM 便开始销毁创建的 Class 对象,最后负责运行的 JVM 也退出内存Fdm28资讯网——每日最新资讯28at.com

面试官:什么是双亲委派模型?Fdm28资讯网——每日最新资讯28at.com

候选人:Fdm28资讯网——每日最新资讯28at.com

如果一个类加载器收到了类加载的请求,它首先不会自己尝试加载这个类,而是把这请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传说到顶层的启动类加载器中,只有当父类加载器返回自己无法完成这个加载请求(它的搜索返回中没有找到所需的类)时,子类加载器才会尝试自己去加载Fdm28资讯网——每日最新资讯28at.com

面试官:JVM为什么采用双亲委派机制Fdm28资讯网——每日最新资讯28at.com

候选人:Fdm28资讯网——每日最新资讯28at.com

主要有两个原因。Fdm28资讯网——每日最新资讯28at.com

第一、通过双亲委派机制可以避免某一个类被重复加载,当父类已经加载后则无需重复加载,保证唯一性。Fdm28资讯网——每日最新资讯28at.com

第二、为了安全,保证类库API不会被修改Fdm28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-38750-0.html什么是类加载器?什么是双亲委派模型?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 几款热门容器化编排工具对比

下一篇: Python中不起眼但是很实用的help函数

标签:
  • 热门焦点
  • Redmi Pad评测:红米充满野心的一次尝试

    Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 企业采用CRM系统的11个好处

    企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 每天一道面试题-CPU伪共享

    每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 华为Mate60标准版细节曝光:经典星环相机模组回归

    华为Mate60标准版细节曝光:经典星环相机模组回归

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,iQOO 11不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞屏,同时在快充
  •  首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
Top