13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

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

图片

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、网页空间、营销软件、网站建设、陆川网站维护、网站推广。

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

要想理解类加载器的话,务必要先清楚对于一个Java文件,它从编译到执行的整个过程。

图片

1.1. 类加载器

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

1.2. 类加载器种类

类加载器根据各自加载范围的不同,划分为四种类加载器:

上述三种类加载器的层次结构如下如下:

图片

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

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

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

图片

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

在工程中新建java.lang包,接着在该包下新建String类,并定义main函数

public class String {

    public static void main(String[] args) {

        System.out.println("demo info");
    }
}

此时执行main函数,会出现异常,在类 java.lang.String 中找不到 main 方法

图片

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

四. 类装载的执行过程?

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

图片

类加载过程详解

1.加载

图片

图片

2.验证

图片

验证类是否符合JVM规范,安全性检查

(1)文件格式验证:是否符合Class文件的规范

(2)元数据验证

(3)字节码验证- 主要的目的是通过对数据流和控制流的分析,确定程序语义是合法的、符合逻辑的。

(4)符号引用验证:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量

比如:int i = 3; 字面量:3 符号引用:i

3.准备

图片

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

图片

4.解析

图片

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

比如:方法中调用了其他方法,方法名可以理解为符号引用,而直接引用就是使用指针直接指向方法。

图片

5.初始化

图片

对类的静态变量,静态代码块执行初始化操作

6.使用

图片

JVM 开始从入口方法开始执行用户的程序代码

7.卸载

当用户程序代码执行完毕后,JVM 便开始销毁创建的 Class 对象,最后负责运行的 JVM 也退出内存

五.类加载器面试

面试官:什么是类加载器,类加载器有哪些?

候选人:

JVM只会运行二进制文件,而类加载器(ClassLoader)的主要作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。

常见的类加载器有4个

第一个是**启动类加载器(BootStrap ClassLoader)**:其是由C++编写实现。用于加载JAVA_HOME/jre/lib目录下的类库。

第二个是**扩展类加载器(ExtClassLoader)**:该类是ClassLoader的子类,主要加载JAVA_HOME/jre/lib/ext目录中的类库。

第三个是**应用类加载器(AppClassLoader)**:该类是ClassLoader的子类,主要用于加载classPath下的类,也就是加载开发者自己编写的Java类。

第四个是自定义类加载器:开发者自定义类继承ClassLoader,实现自定义类加载规则。

面试官:说一下类装载的执行过程?

候选人:

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

1.加载:查找和导入class文件

2.验证:保证加载类的准确性

3.准备:为类变量分配内存并设置类变量初始值

4.解析:把类中的符号引用转换为直接引用

5.初始化:对类的静态变量,静态代码块执行初始化操作

6.使用:JVM 开始从入口方法开始执行用户的程序代码

7.卸载:当用户程序代码执行完毕后,JVM 便开始销毁创建的 Class 对象,最后负责运行的 JVM 也退出内存

面试官:什么是双亲委派模型?

候选人:

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

面试官:JVM为什么采用双亲委派机制

候选人:

主要有两个原因。

第一、通过双亲委派机制可以避免某一个类被重复加载,当父类已经加载后则无需重复加载,保证唯一性。

第二、为了安全,保证类库API不会被修改


网页题目:什么是类加载器?什么是双亲委派模型?
本文URL:http://cdbrznjsb.com/article/djjdjip.html

其他资讯

让你的专属顾问为你服务