什么是jvm双亲委派模型?有什么用?

哎哟JAVA不错哦


我们都知道jvm类加载使用的是双亲委派模型,那么到底什么是双亲委派模型?这样做的好处又是什么呢?又如何打破双亲委派模型呢?

先来了解下JVM中的类加载器:JVM类加载器大致可以分为以下几种:

1,启动类加载器:Bootstrap ClassLoader:负责加载jre\\lib下面的jar中的类进入内存,在HotSpot虚拟机中,是使用C++进行实现;

2,扩展类加载器:Extension ClassLoader:负责加载jre\\lib\\ext下面的扩展型jar中的类进行入内存;

3,系统类加载器:Application ClassLoader:负责加载应用中classpath目录下面的所有jar。

4,自定义加载器:通过继承ClassLoader,可实现自己的类加载器,通常可以用在热部署,网络输入的流等类库;

几种类加载器的继承关系如下:



双亲委派模型:一个类加载器收到类加载任务的时候,会先查看是不是已经被加载过,如果没有加载过则委托给父加载器进行加载,父加载器经过同样的过程,如果父加载器搜索不到这个类,则让子加载器自己尝试着加载,如果所有加载器都找不到,则抛出ClassNotFoundException异常;



一句话总结双亲委派模型的特点是:父亲能干的事就让父亲干,干不了再让儿子来;

双亲委派模型好处:比如说,某“坏人”在将jre\\lib下面的包中的某个类(a.b.c)中,意图植入大量的恶意代码,但因为这个原本的类已经被Bootstrap ClassLoader加载过了,后面加入的a.b.c不会在加载进入内存中,双亲委派模型的类加载方式,就能防止恶意代码的向顶层污染;

打破双亲委派模型:要打破双亲委派模型的加载方式,首先需要集成ClassLoader,然后再重写loadClass(),findClass(),因为双亲委派的代码逻辑主要在loadClass方法中,重写覆盖loadClass方法,让父类加载器加载失败,这样就可以交由自定义的类加载器加载了;



双亲委派模型就说这么多,下次将会从ClassLoader类加载器的源码角度,详细分析下类加载器的加载过程,如果有需要的朋友,敬请关注。。


分享到:


相關文章: