你能说出jvm中双亲委派模型的来龙去脉吗

211 阅读3分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。

前言

这是我们JVM系列的第二章,在第一章里我们讲了类加载以及不同的类加载器。

有不了解的同学可以点开这个链接:你能说出jvm的类加载是什么吗(1)

当然了,有了类加载器,我们还需要按照某种规则去加载类,这就是我们今天主角:双亲委派模型。JVM一般情况下会按照这个规则去加载我们所需要的类。

具体是怎么样的呢?往下看

目录结构

带着问题去找答案,往往能加深印象。所以呢,我这边准备了几个问题给大家:

  • 如果我创建了一个java.util.ArrayList这个类,JVM会允许类加载器去加载它吗?
  • 如果JVM允许,是会替换还是全部保留?
  • 如果全部保留,当我采用New这个关键字创建对象时,使用的是哪个ArrayList
  • 这么做会不会对JVM整个体系产生其他影响?

JVM会加载自己创建的类吗

先说结论:会。

在JVM中,类是否相同取决于类的全限定名和类加载器,所以当我们用不同的类加载器加载时,会判断这个类是否被这个类加载器加载过,如果已经加载过,会不再去加载它。划重点~

如果JVM允许,是会替换还是全部保留?

先说结论:会。

这边我们使用自定义的类加载器去加载,然后使用Arthas查看已经加载的类结果~ image.png 可以看到BigData这个类在JVM中存在了两个。如果查看详情,你还能发现其中一个BigData是自定义类加载器加载的。

使用new关键字

当我采用new这个关键字创建对象时,会使用哪个BigData呢,或者说是哪个加载器类加载的类。

如果你是HotSpot JVM的创造者,你会使用哪个类加载器加载的类?

A:JDK的类加载器。B:自定义类加载器。

这边使用了自定义类加载器加载类,然后用关键字New创建对象后查看对象的类加载器。 看下图做上面的选择题:

image.png

image.png

这么做会不会对JVM整个体系产生其他影响?

实际上,绝大多数业务代码都是由AppClassLoader加载。正常情况下,如果你没有什么骚操作,产生的影响几乎为0。

阿里对系统的可靠性要求是4个9,也就是99.99%。而作为整个Java基础的JVM,必须保证万无一失。所以才有了双亲委派模型,用来保证不会加载相同包名的类,并且在加载类时还用了前缀校验,

image.png

什么是双亲委派模型

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。

每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载

image.png

双亲委派模型源码解读

image.png

结尾

本文着重介绍了JVM加载类的规则,也就是双亲委派模型。这个模型,在整个类加载中有着举足轻重的地位。之后也会陆陆续续的提到它,希望不了解的小伙伴再去加深点印象!推荐周志明大神的:《深入理解Java虚拟机》

下期预告:双亲委派模型的应用,也或许是其他的,哈哈。

喜欢这篇文章的话点个赞哦,咱们下期见!!