`

类加载器的双亲委派模型

    博客分类:
  • JVM
阅读更多

双亲委派模型
    从Java虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++实现,时虚拟器自身的一部分;另一种就是所有其他的类加载器,这类加载器都由Java实现,独立于虚拟机外部,并且都继承自抽象类java.lang.ClassLoader。
    从开发人员的角度来看,类加载器还可以划分的更细致一些,绝大部分Java程序都会使用到一下3中系统提供的类加载器。
  • 启动类加载器(Bootstrap ClassLoader),这个类加载器前面已经介绍过,主要负责将存放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的jar,并且是能够被虚拟机识别的(按照文件名识别,比如rt.jar,名字不符合虚拟机识别要求的即使放在该lib目录下也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给引导类加载器,那直接使用null代替即可。
  •    
  • 扩展类加载器(Extension ClassLoader):这个加载器由sun.misc.Launcher$ExtClassLoader实现,他负责加载<JAVA_HOME>/ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。
  •    
  • 应用程序类加载器(Application ClassLoader):这个类加载器由sun.misc.Launcher$AppClassLoader实现。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也称它为系统类加载器。他负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器器,如果应用程序中没有自定义过自己的类加载器,那么一般情况这个就是程序中默认的类加载器。
    我们的应用程序都是由这3中类加载器互相配合进行加载的,如果有必要,还可以加入我们自定义的类加载器,这些类加载器的关系如下图所示:

    上图中所展示的类加载器之间的层次关系,成为类加载器的双亲委派模型(Parents Delegation Model)。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。但是这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都是使用组合的方式来复用父类加载器的代码。
     类加载器的双亲委派模型在JDK1.2期间被引入并广泛应用于几乎所有的Java程序中,但它并不是一个强制性的约束模型,而是Java设计者推荐给开发者的一种类加载器实现方式。
     工作过程:如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。
      使用双亲委派模型的好处:Java类随着它的类加载器一起具备了一种带有优先级的层次关系。它存放在rt.jar中,无论哪一个类加载器都要加载这个类,最终都是委派给处于最顶端的启动类加载器进行加载,因此Object类在程序中的各种类加载环境中都是同一个类,相反,如果没有使用双亲委派模型,由各个类加载器自行去加载的话,(如果用户自己编写了一个不同的java.lang.1Object类,并放在classpath中,那么系统中将会出现多个不同的Object类,这样一来Java类型体系中最基础的行为也就无法保证,应用程序也将变得一片混乱),那么会使整个工程变得混乱。

      双亲委派模型对于保证Java程序的稳定运行很重要,但是它的实现却非常简单,实现双亲委派模型的代码都集中在java.lang.ClassLoader的loadClass()方法中。

     注意:即使是自定义了自己的类加载器,强行用defineClass()方法去加载一个以"java.lang"开头的类也不会成功。如果你尝试这么做,那么将会受到一个有虚拟机抛出的"java.lang.SecurityException:prohibited package name:java.lang"异常。
   
参考资料:
《深入理解Java虚拟机:JVM高级特性与最佳实践》 周志明著
http://www.360doc.com/content/14/0803/16/8072791_399149454.shtml
  • 大小: 49.5 KB
分享到:
评论

相关推荐

    javakam#AndoJavaKotlin#类加载器及双亲委派1

    类加载器及双亲委派双亲委派模型的整个工作流程非常的简单,如下所示:如果一个类加载器收到了加载类的请求,它不会自己立即去加载类,它会先去请求父类加载器,每个层次的

    JVM的类加载过程以及双亲委派模型详解

    主要介绍了JVM的类加载过程以及双亲委派模型详解,类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象。,需要的朋友可以参考下

    类加载器和双亲委派模型加载类、类的加载优先级的详解.docx

    类的生命周期包含了如上的7个阶段,其中 验证 、 准备 、 解析 统称为 连接,类的加载主要是前五个阶段,每个阶段基本上保持如上顺序 开始(仅仅是开始,实际上执行是交叉混合的),只有 解析 阶段不一定...

    【JVM】类加载器与双亲委派模型

    类加载器在加载阶段,会将class文件加载进方法区。有关类加载的全过程,可以先参考我的另外一篇文章类的奇幻漂流——类加载机制探秘 类加载器的类型 类加载器有以下种类: 启动类加载器(Bootstrap ClassLoader) ...

    java类加载机制.xmind

    该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大...包括双亲委派机制,违背双亲委派模型,开发自己的类加载器等等

    深入了解 JVM 虚拟机(超详细入门攻略)

    类加载器双亲委派模型机制10. 什么是类加载器,类加载器有哪些?11. 简述 java 内存分配与回收策率以及 Minor GC 和Major GC 1. 内存模型以及分区 JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用...

    java虚拟机、进程周期,类加载1器和类使用要点简述

    类加载器 (类加载器使用双亲委派模型,为的是避免类的重复加载) 1、Java虚拟机与进程的生命周期 2、类的加载、连接与初始化 3、Java程序对类的使用可以分为两种:

    Java面试突击版1

    介绍下类件结构吧!2.4.14 类加载过程知道类加载的过程吗?那加载这步做了什么?知道哪些类加载器?双亲委派模型知道吗?能介绍下吗?双亲委派模型介绍双亲委派模型

    《剑指offer》JVM面试题总结.pdf

    JVM 面试题总结 JVM 的主要作用是什么? 请你描述一下 Java 的内存区域? 请你描述一下 Java 中的类加载机制? 加载 验证 准备 ...什么是双亲委派模型? 双亲委派模型的缺陷? 双亲委派机制的三次破坏

    JVM讲解视频.zip

    类加载器双亲委派机制 oJVM内存模型深度理解 JVM内存模型结构 线程栈及栈帧内部结构详解 程序计数器详解 本地方法栈详解 堆详解 JVM启动参数设置 堆内存大小设置 方法区内存大小设置 栈分配...

    leetcode题库-Blog:Fashion'sBlog个人学习笔记,涵盖JVM、数据结构、算法、设计模式、中间件、数据库、缓存、分布式微服

    类加载器 双亲委派 JVM性能调优监控工具 设计模式 消息中间件 RocketMQ 概念 RocketMQ 特性 RocketMQ 集群 RocketMQ 事务 RocketMQ 常见问题 数据库 Redis 基本数据结构 进阶使用 持久化 集群 分布式锁 Client API ...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 189 7.4.1 类与类加载器 / 189 7.4.2 双亲委派模型 / 191 7.4.3 破坏双亲委派模型 / 194 7.5 本章小结 / 197 第8章 虚拟机字节码执行引擎 / 198 8.1 概述 / 198 8.2 运行时栈帧结构 / 199 8.2.1 局部变量...

    Java虚拟机

    7.4.3 破坏双亲委派模型 7.5 本章小结 第8章 虚拟机字节码执行引擎 8.1 概述 8.2 运行时栈帧结构 8.2.1 局部变量表 8.2.2 操作数栈 8.2.3 动态连接 8.2.4 方法返回地址 8.2.5 附加信息 8.3 方法调用 ...

    JVM思维导图(包含所有JVM知识)

    JVM整体结构内存模型(对象的创建,指针压缩,对象大小,对象内存),垃圾收集器,垃圾收集器算法、内存调优(调优工具),垃圾收集,内存回收(算法),类加载机制(类加载过程,双亲委派),一图学完JVM所有的知识...

    涵盖了90%以上的面试题

    双亲委派模型 为什么要自定义类加载器 如何自定义类加载器 什么是GC 内存泄漏和内存溢出 Java的内存模型(JVM的内存划分) JVM内存模型1.7和1.8的区别 如何判断一个对象是否是垃圾对象 垃圾回收算法 Minor GC和Full GC...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第94节双亲委派模型00:17:03分钟 | 第95节运行时栈帧结构00:08:46分钟 | 第96节局部变量表00:20:48分钟 | 第97节操作数栈00:08:36分钟 | 第98节动态连接00:02:56分钟 | 第99节方法返回地址和附加信息00:03:24...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第94讲 双亲委派模型 00:17:03  第95讲 运行时栈帧结构 00:08:46  第96讲 局部变量表 00:20:48  第97讲 操作数栈 00:08:36  第98讲 动态连接 00:02:56  第99讲 方法返回地址和附加信息 00:03:24  第...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【JVM】双亲委派模型中,从顶层到底层,都是哪些类加载器,分别加载哪些类? 55 【JVM】能不能自己写个类叫java.lang.System? 57 【JVM】类的加载过程 58 【JVM】类的初始化 58 类什么时候才被初始化: 58 类的初始...

    互联网创意产品众筹平台

    双亲委派机制 │ 15-附录5.空指针异常产生的原因 │ 16-附件7.列编辑 │ ├─众筹项目-第04天《Atcrowdfunding》 │ ├─代码 , R4 H* ~+ j3 g+ ?# \% P+ c │ ├─笔记, ^% P) P8 t. Y/ u n/ s8 [; l │ └─视频4...

    java核心知识点整理.pdf

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM .........................

Global site tag (gtag.js) - Google Analytics