JVM双亲委派机制详解

前言

这个是阿里云活动白嫖的学习会员,课程名是 《11分钟搞定JVM的双亲委派机制》 ,这个是学习笔记。

学习后可以解决的问题

JVM为什么会抛出ClassNotFund异常?在抛出这个异常的时候JVM的类加载器做了什么工作?

Java程序在执行的过程中,是先执行父类还是先执行子类。如果加载父类,那么父类还有父类呢,这个时候JVM还要怎么处理,

JVM是如何保证类加载的有序性和安全性?

类加载器的分类

分类

在这里插入图片描述

每个类加载器的作用

启动类加载器

负责加载Java_HOME目录下,lib的目录下的类库。
在这里插入图片描述

扩展类加载器

负责加载Java_HOME目录下,lib子目录下的ext的子目录的类库
在这里插入图片描述

应用程序类加载器

在这里插入图片描述
加载用户路径classpath上的类库。

自定义类加载器

通过继承 java.lang.ClassLoader,根据不同的需求来实现自定义的类加载器。然而在实际开发中,我们必然是要继承JDK中的类或者实现JDK中的接口。
在这里插入图片描述

解决方法:双亲委派

包含内容

在这里插入图片描述

向上委派

如何理解向上委派?

一个类在收到类加载请求后,不会自己加载这个类,而是把这个类加载请求向上委派给它的父类去完成,父类收到这个请求后又继续向上委派给自己的父类,以此类推,直到所有的请求委派到启动类加载器中。

tips: 这让双亲委派机制保证类加载的顺序性。

在这里插入图片描述

向上委派的过程是怎样的?

第一步: 将自定义加载器挂载到应用程序类加载器
第二步: 应用程序类加载器将请求委托给扩展类加载器
第三步: 扩展类加载器将请求委托给启动类加载器
在这里插入图片描述

向下委派

如何理解向下委派

当父类加载器在接收到类加载请求后,发现自己也无法加载这个类(这个情况通常是因为这个类的Class文件在父类的加载路径中不存在)这时父类会把这个信息反馈给子类,并向下委派子类加载器来加载这个类,直到这个请求被成功加载,但是一直到自定义加载器都没有找到,JVM就会抛出ClassNotFund异常。
在这里插入图片描述

向下委派的加载过程(报ClassNotFund的过程)

第一步: 启动类在加载路径下查找并加载Class文件,如果没有找到就交给扩展类加载器加载
第二步:扩展类加载器在它的加载路径下查找并加载Class文件,如果还是没有找到,再交给应用程序类加载器加载
第三步:应用程序类加载器在加载路径下查找并加载Class文件,如果还是没有找到,就交给自定义加载器进行加载
第四步:自定义加载器在用户指定的位置进行查找并加载Class文件,如果还是没有找到,JVM抛出ClassNotFund异常。这时类加载失败,JVM也启动失败。
在这里插入图片描述

双亲委派的核心:保证类的安全性和唯一性

在这里插入图片描述
向上委派机制保证先加载JDK的核心类,再加载应用程序的类,有效防止了因为应用程序中因为某个类的存在一些不安全问题,导致JVM变得不安全。

向下委派机制保证需要加载的类,都得到了加载。

例子:
不管是在哪个jar包下的类最终都会委派给启动类加载器进行加载。比如我自定义

public class StringBuffer {
      public StringBuffer(){
      }
}

如果没有向下委派一直到启动类加载器,那StringBuffer就变成我这个了。安全性出来了。
如果在JVM存在包名和类名完全相同的两个类,这个类就无法被加载。

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值