Java的双亲委派机制


参考&鸣谢

Dream_ling、
weixin_39610188、
JVM底层原理解析


文章目录

  • Java的双亲委派机制
    • 一、介绍
    • 二、什么是双亲委派机制
    • 三、双亲委派模型工作流程
    • 四、代码验证
    • 五、双亲委派机制优势

一、介绍

Java虚拟机对class文件采用的是按需加载的方式,

也就是说当需要使用该类时才会将它的class文件加载到内存生成的class对象。

而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式

即把请求交由父类处理,它是一种任务委派模式


二、什么是双亲委派机制

当某个特定的类加载器它在接到需要加载类的请求时,这个类会首先查看自己已加载完的类中是否包含这个类,如果有就返回,没有的话就会把加载的任务交给父类加载器加载,以此递归,父类加载器如果可以完成类加载任务,就返回它,当父类加载器无法完成这个加载任务时,才会不得已自己去加载。这种机制就叫做双亲委派机制。


三、双亲委派模型工作流程

1.当Application ClassLoader 收到一个类加载请求时,他首先不会自己去尝试加载这个类,而是将这个请求委派给父类加载器Extension ClassLoader去完成。

2.当Extension ClassLoader收到一个类加载请求时,他首先也不会自己去尝试加载这个类,而是将请求委派给父类加载器Bootstrap ClassLoader去完成。

3.如果Bootstrap ClassLoader加载失败(在<JAVA_HOME>\lib中未找到所需类),就会让Extension ClassLoader尝试加载。

4.如果Extension ClassLoader也加载失败,就会使用Application ClassLoader加载。

5.如果Application ClassLoader也加载失败,就会使用自定义加载器去尝试加载。

6.如果均加载失败,就会抛出ClassNotFoundException异常。

例子:

当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理会先检查自己是否已经加载过,如果没有再往上。注意这个过程,直到到达Bootstrap classLoader之前,都是没有哪个加载器自己选择加载的。如果父加载器无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException。


四、代码验证

通过查看最顶层父类ClassLoader的loaderClass方法,我们可以验证双亲委派机制。

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// 首先检查此类是否被加载过了 Class<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {// 调用父类的加载器方法if (parent != null) {c = parent.loadClass(name, false);} else {// 此时是最顶级的启动类加载器c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// 抛出异常说明父类无法加载}if (c == null) {//父类无法加载的时候,由子类进行加载。// to find the class.long t1 = System.nanoTime();c = findClass(name);//记录加载时间已经加载耗时sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}}

五、双亲委派机制优势

  • 避免类的重复加载

    当自己程序中定义了一个和Java.lang包同名的类,此时,由于使用的是双亲委派机制,会由启动类加载器去加载JAVA_HOME/lib中的类,而不是加载用户自定义的类。此时,程序可以正常编译,但是自己定义的类无法被加载运行。

  • 保护程序安全,防止核心API被随意篡改。通过委托方式,不会去篡改核心.class,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。

「 JVM基础 」Java双亲委派机制相关推荐

  1. 什么是java双亲委派机制

    什么是双亲委派机制 在介绍双亲委派模型之前先说下类加载器.对于任意一个类,都需要由加载它的类加载器和这个类本身统一确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间.类加载器就是根据 ...

  2. JVM - 彻底理解打破双亲委派机制

    文章目录 Pre 双亲委派 何为打破双亲委派 如何打破双亲委派 演示 重写 ClassLoader#loadClass 失败原因探究 临时解决办法 验证是否成功 应用下新建Boss1类 自定义加载路径 ...

  3. Java双亲委派机制

    1.什么是双亲委派? 虚拟机在加载类的过程中需要使用类加载器进行加载,而在Java中,类加载器有很多,那么当JVM想要加载一个.class文件的时候,到底应该由哪个类加载器加载呢? 这就不得不提到&q ...

  4. android双亲委派机制,3分钟了解Java双亲委派机制

    你得先知道 在介绍双亲委派机制的时候,不得不提 ClassLoader .说ClassLoader之前,我们得先了解下Java的基本知识. Java是运行在Java的虚拟机(.class 的 JVM中 ...

  5. 简单的Java双亲委派机制

    双亲委派机制 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且加载某个类的class文件时,Java虚拟机采用的 ...

  6. java 委托_面试官:java双亲委派机制及作用

    什么是双亲委派机制 当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类. 类加载器的类别 Bootst ...

  7. JAVA 双亲委派机制

    最近突然看到了关于Java的双亲委派机制,作为一个搞Java的程序猿还是应该知道是怎么回事. 我用一个程序来简单说明是怎么回事吧 package java.util;/*** 本类中的main方法不会 ...

  8. java 双亲委派机制为什么叫“双亲”

    了解了双亲委派机制是什么之后,一直纠结为什么这里要叫"双亲",于是乎上网查了一些资料,大部分都说是翻译的问题,除此之外,其中一篇博客中提到了另一种见解,可以作为参考理解. &quo ...

  9. Java双亲委派机制在Android的应用

    Java的双亲委派机制 三层类加载器 1.启动类加载器(Bootstrap Class Loader) 这个类加载器负责加载存放在<JAVA_HOME>\lib目录,或者被-Xbootcl ...

最新文章

  1. 测试中如何管理外包质量_如何从测试自动化中实现价值
  2. 一篇文章让你了解区块链技术的发展阶段
  3. Spring Boot 集成 Activiti
  4. hyper服务器虚拟网卡和实际网卡,Hyper-V 3 虚拟网卡带宽应用限制
  5. 腾讯视频怎么开启运营商网络自动播放
  6. 五种常见粗粮的最佳养生吃法
  7. 打通版微社区(5):部署DZ3.2
  8. 编译原理完整学习笔记(八):目标代码生成
  9. 外卖侠使用教程【干货】
  10. SourceInsight查看java源代码
  11. 计算机开机界面图片怎么修改,电脑win7系统怎么修改开机画面的方法
  12. ISO 9001是什么?ISO 9001 质量管理体系详细介绍
  13. RCC BUCK变压器设计
  14. 首发|罗振宇2018“时间的朋友”跨年演讲未删减全文
  15. Python游戏概率保底算法PRD的实现
  16. 高盛:人工智能报告中文版
  17. 程序员可以通过软考来办理北京户口,成为北京人
  18. 如何全面欣赏一场时装秀?
  19. Contest3121 - 2021级新生个人训练赛第26场_问题 F: 乐乐的数字
  20. 二进制(一):由来及简介

热门文章

  1. idea创建module没有图标显示
  2. 信号完整性100条经验法则
  3. html标签之视频各种标签
  4. 第三章 系统的时域分析
  5. com.google.guava maven依赖
  6. SQL 语句多表联查
  7. 连接池的原理以及分析
  8. 了解 Fetch API
  9. Spring Cloud Zuul API 网关服务
  10. 矩阵论 - 7 - 求解Ax=0:主变量、特解