什么是 JVM 双亲委派机制?
题目
什么是 JVM 双亲委派机制?
推荐解析
通俗的说,双亲委派模型,就是加载类的时候,先请求其父类加载器去加载,如果父类加载器无法加载类,再尝试自己去加载类。如果都没加载到,就抛出异常。
双亲委派机制加载过程:
双亲委派机制思维导图:
使用双亲委派机制的好处:
1)使得 Java 类随着它的类加载器一起具有一种带有优先级的层次关系,每个层级得到了统一。
2)通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子 ClassLoader 再加载一次,避免了多份同样字节码的加载。
3)安全,避免核心类被修改 Java 核心 API 中定义类型不会被随意替换,假设通过网络传递一个名为 Java.lang.Long 的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心 Java API 发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的 Java.lang.Long,而直接返回已加载过的 Long.class,这样便可以防止核心 API 库被随意篡改。
总结:
1)层级得到统一
2)避免相同字节码被重复加载
3)防止核心 API 库被随意篡改
其他补充
鱼聪明AI 的回答:
鱼聪明 AI地址:鱼聪明AI
双亲委派模型是 Java 类加载器的一种工作模式,通过这种模式,Java 虚拟机将类文件加载到内存中,以保证 Java 程序能够正常运行。
双亲委派模型的工作流程如下:
1)当加载一个类时,会先从应用程序类加载器的缓存里查找相应的类,如果能找到就返回对象,如果找不到就执行下面流程;
2)在扩展加载器缓存中查找相应的类,如果能找到就返回对象,如果找不到就继续下面流程;
3)在启动类加载器中查询相应的类,如果找到就返回对象,如果找不到就继续下面流程;
4)在扩展加载器中查找并加载类,如果能找到就返回对象,并将对象加入到缓存中,如果找不到就继续下面流程;
5)在应用程序类加载器中查找并加载类,如果能找到就返回对象,并将对象加入到缓存中,如果找不到就返回 ClassNotFound 异常。
这个模型的优点包括:
1)安全性:双亲委派模型可以保证先加载 JDK 的核心类,再加载应用程序的类,有效防止了因为应用程序中因为某个类的存在一些不安全问题,导致JVM变得不安全。
2)避免重复加载:向下委派机制保证需要加载的类,都得到了加载。
CSDN 同学的回答:
1)当加载一个类时,先判断此类是否已经被加载,如果类已经被加载则返回;
2)如果类没有被加载,则先委托父类加载(父类加载时会判断该类有没有被自己加载过),如果父类加载过则返回;如果没被加载过则继续向上委托;
3)如果一直委托都无法加载,子类加载器才会尝试自己加载。
博客园 同学的回答:
1)当一个加载器要加载类的时候,若自己加载不了。
2)就逐层向上交由双亲去加载,当双亲的某个加载器加载成功后,再向下返回成功。
3)如果所有的双亲和自己都无法加载,则会抛出异常。
推荐阅读书籍和文章
1)《深入拆解 Java 虚拟机》推荐理由:想要深入了解 JVM 的,此书是必读项!
2)深入分析Java ClassLoader原理,推荐理由:文章对于类加载的原理、为什么要使用双亲委派机制讲的十分详细,图文结合。
欢迎交流
关于双亲委派机制其实还有很多可以讲,我在这里抛出几个问题,大家可以在评论区进行留言进行回答,你的回答也许将会成为其他小伙伴面试中的一部分,大家可以互相交流,拓展自己的思路。
1.双亲委派机制有缺点吗?有哪些缺点?
2.怎么打破双亲委派机制?为什么要打破?
3.打破双亲委派机制的场景有哪些,可以举例说明吗?