双亲委派机制

从Java虚拟机的角度来看,只有两种不同的类加载器:其中一种是由C/C++编写的启动类加载器;另外一种是由java编写的其他类加载器。如果从Java程序的角度出发,可以分为上图所示的类加载器模型。现在简要介绍一下双亲委派机制:

启动类加载器:这个类加载器主要是加载存放在<JAVA_HOME>\lib目录,或者是被-Xbootclasspath参数所指定路径下,而写是java虚拟机能够识别的类库加载到虚拟机的内存中。

扩展类加载器:这个类加载器是在类sun.misc.Launcher$ExtClassLoader中以Java代码实现的,它负责加载<JAVA_HOME>\lib\ext目录中,或者被java.ext.dirs系统变量所指定的类库。

应用程序类加载器:这个类加载器是在类sun.misc.Launcher$AppClassLoader中以java代码实现的,它负责加载用户类路径上所有的类库。

双亲委派机制的工作过程是:当类加载器收到了类加载的请求时,它首先不会去自己加载这个类,而是将这个类委派给父加载器去完成,每一层的加载器都是如此。所以说每次类的加载,都会传送到顶层的启动类加载器。当父加载器反馈自己的无法加载此类时,才会由自己去完成加载。

双亲委派机制中,除了启动类加载器之外,所有的类加载器都有自己的父加载器。利用双亲委派机制的好处就是Java中的类的加载随着类加载器而具备一定的层级关系,不会造成混乱。例如java.lang.Object,它存在与rt.jar中,它最终都是委派给最顶层的类启动加载器完成加载的,所以在程序的类加载器环境中都能保证是同一个类。

posted @ 2022-05-21 16:40  知识怪人  阅读(327)  评论(0编辑  收藏  举报