JVM-双亲委派机制

我们两清 提交于 2019-12-27 05:07:51

JVM-双亲委派机制

双亲委派的好处

了解双亲委派之前先说一下双亲委派的好处
1.主要是为了安全性,避免用户自己编写的类动态替换Java的一些核心类,比如Spring
2.避免类的重复加载,因为JVM中区分不同类,不仅仅根据类名,相同的class文件被不同的ClassLoader加载就是不同的两个类

双亲委派

虚拟机提供了3种类加载器,引导(Bootstrap)类加载器、扩展(Extension)类加载器、应用类加载器,以及父类加载器为AppClassLoader的自定义类加载器。
在Launcher中实现:
1.启动类加载器
启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现,是虚拟机自身的一部分,他负责将/lib路径下的核心类库或-Xbootclasspath参数指定路径下的jar包加载到内存中。注意由于虚拟机是按照文件名识别加载jar包的,如果文件名不被虚拟机识别,即使吧jar包丢到lib目录下也是没有用的(处于安全考虑Bootstrap启动类加载器只加载包名为java、javax。sun等开头的)。
2.扩展类加载器
扩展类加载器是指Sun公司(以被Oracle收购)实现的sun.misc.Launcher$ExtClassLoader类,由java语言实现的,是Launcher的静态内部类,它负责加载/lib/ext目录下或者由系统变量-Djava.ext.dir指定路径中的类库,开发者可直接使用标准扩展类加载器。
3.应用程序类加载器
它负责加载系统类路径java -classpath或者-Djava.classpath指定路径下的类库,也就是我们经常用到的classpath路径,开发者可以直接使用系统类加载器,一般情况下该类加载是程序中默认的类加载器,通过ClassLauncher#getSystemClassLauncher()方法可以获取到该类加载器。

这3种类加载器之间存在着父子关系(区别与java里的继承),子加载器保存着父加载器的引用(组合的形式)当一个类加载器需要加载一个目标时,先会委托父加载器去加载,然后父加载器会在自己的加载路径中搜索目标类,父加载器在自己的加载范围中找不到时,才会交还给子加载器去加载目标。
采用双亲委托模式可以避免类加载混乱,而且还将类分了层次,例如java中lang包下的类在jvm启动时就被启动类加载器加载了,而用户的一些代码类则由应用程序类加载器加载,基于双亲委派模式,就算用户定义了lang包中一样的类,最终还是由应用程序类加载器委托给启动类加载器去加载,这个时候启动类加载器已经加载过lang包下的类了,所以两者不会再重新加载。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!