什麼是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類加載器的源碼角度,詳細分析下類加載器的加載過程,如果有需要的朋友,敬請關注。。


分享到:


相關文章: