亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

JVM 雙親委派模型

1. 前言

上節課程的小結部分提到,雙親委派模型是加載(Loading)步驟中所使用的模型,上節內容為本節內容的基礎知識,學習本節內容之前,要確保已經掌握了上節所講解的內容。本節主要知識點如下:

  • 了解雙親委派模型的示意圖,是本節課程的基礎知識;
  • 掌握雙親委派模型的工作原理,并結合示意圖進行理解,為本節內容的核心知識點;
  • 舉出三個不同類型的案例供學習者參考,更深入的了解雙親委派模型的工作原理,為本節內容的重點內容;

2. 雙親委派模型

在講解雙親委派模型之前,我們先來看看雙親委派模型的示意圖,相信看到如下示意圖中的模塊信息,學習者會感到莫名的親切感。示意圖如下:

圖片描述

上圖中的親切感來自哪里呢?我們可以看到在雙親委派模型中,有三種類加載器是我們上節課程中所講解的,有了上節課程的知識積淀,再理解雙親委派模型會非常的容易。

雙親委派模型原理

  • 向上委托:如果一個類加載器收到了類加載請求,它并不會自己先去加載,而是把這個請求委托給父類的加載器去執行,如果父類加載器還存在其父類加載器,則進一步向上委托,依次遞歸,請求最終將到達頂層的啟動類加載器。如果父類加載器可以完成類加載任務,就成功返回;
  • 向下委派:倘若父類加載器無法完成此加載任務,子加載器才會嘗試自己去加載,這就是雙親委派模式。

如果對于原理性的描述還是比較模糊的話,不要著急,我們繼續學習下邊的內容,通過案例體會雙親委派模型的原理。

3. 案例 1:加載 /jre/lib/resources.jar

通過上節課程的學習,我們能夠知道 /jre/lib/resources.jar 是需要被啟動(BootStrap)類加載器加載的核心類庫,那么我們來看看它的加載流程圖。

加載流程圖:根據雙親委派模型,我們來看下 resources.jar 的完整加載過程。

圖片描述

從上圖中我們可以看到,對于核心類庫 resources.jar 的加載,分為以下 4 步:

  • 步驟 1:resources.jar 會先通過自定義類加載器(前提是我們實現了自定義類加載器),自定義類加載器不會做處理,直接向上委托給系統(System Application)類加載器;
  • 步驟 2:系統(System Application)類加載器接到委托后,也不做任何處理,直接向上委托給擴展(Extension)類加載器;
  • 步驟 3:擴展(Extension)類加載器接到委托后,也不做任何處理,直接向上委托給啟動(Bootstrap)類加載器;
  • 步驟 4:啟動(Bootstrap)類加載器接到委托后,發現 resources.jar 是自己負責加載的核心類庫,于是進行加載,最后成功加載了 resources.jar。

4. 案例 2:加載 /jre/lib/ext/cldrdata.jar

通過上節課程的學習,我們能夠知道 /jre/lib/ext/cldrdata.jar 是需要被擴展(Extension)類加載器加載的核心類庫,那么我們來看看它的加載流程圖。

加載流程圖:根據雙親委派模型,我們來看下 cldrdata.jar 的完整加載過程。

圖片描述

從上圖中我們可以看到,對于核心類庫 cldrdata.jar 的加載,分為以下 5 步:

  • 步驟 1:cldrdata.jar 會先通過自定義類加載器(前提是我們實現了自定義類加載器),自定義類加載器不會做處理,直接向上委托給系統(System Application)類加載器;
  • 步驟 2:系統(System Application)類加載器接到委托后,也不做任何處理,直接向上委托給擴展(Extension)類加載器;
  • 步驟 3:擴展(Extension)類加載器接到委托后,也不做任何處理,直接向上委托給啟動(Bootstrap)類加載器;
  • 步驟 4:啟動(Bootstrap)類加載器接到委托后,發現 cldrdata.jar 不是自己負責加載的核心類庫,于是進行向下委派,委派給擴展(Extension)類加載器;
  • 步驟 5:擴展(Extension)類加載器接到委派后,發現 cldrdata.jar 是自己負責加載的核心類庫,于是進行加載,最后成功加載了 cldrdata.jar。

Tips:我們可以看到,在向上委托的過程中,cldrdata.jar 雖然在步驟 3 已經達到了擴展(Extension)類加載器,但是由于擴展(Extension)類加載器需要遵循向上委托的原則,必須要將 cldrdata.jar 向上委托給啟動(Bootstrap)類加載器,直到啟動(Bootstrap)類加載器向下委派 cldrdata.jar 到擴展(Extension)類加載器才進行類庫的加載。

5. 案例 3:加載 /jre/lib/plugin.jar

通過上節課程的學習,我們能夠知道 /jre/lib/plugin.jar 是需要被系統(System Application)類加載器加載的核心類庫,那么我們來看看它的加載流程圖。

加載流程圖:根據雙親委派模型,我們來看下 plugin.jar 的完整加載過程。

圖片描述

從上圖中我們可以看到,對于核心類庫 plugin.jar 的加載,分為以下 6 步:

  • 步驟 1:plugin.jar 會先通過自定義類加載器(前提是我們實現了自定義類加載器),自定義類加載器不會做處理,直接向上委托給系統(System Application)類加載器;
  • 步驟 2:系統(System Application)類加載器接到委托后,也不做任何處理,直接向上委托給擴展(Extension)類加載器;
  • 步驟 3:擴展(Extension)類加載器接到委托后,也不做任何處理,直接向上委托給啟動(Bootstrap)類加載器;
  • 步驟 4:啟動(Bootstrap)類加載器接到委托后,發現 plugin.jar 不是自己負責加載的核心類庫,于是進行向下委派,委派給擴展(Extension)類加載器;
  • 步驟 5:擴展(Extension)類加載器接到委派后,發現 plugin.jar 也不是自己負責加載的核心類庫,于是進行向下委派,委派給系統(System Application)類加載器;
  • 步驟 6:系統(System Application)類加載器接到委派后,發現 plugin.jar 是自己負責加載的核心類庫,于是進行加載,最后成功加載了 plugin.jar。

Tips:類似于案例 2 的講解,雖然 plugin.jar 是系統(System Application)類加載器負責加載的,但是要遵循向上委托的原則,因此在步驟 2 不能夠實時加載,只能等待父加載器向下委派時加載。

6. 小結

通過對雙親委派模型的講解,我們了解到了雙親委派模型的定義以及原理,并通過 3 個案例詳細的講述了在雙親委派模型下是如何進行的類庫的加載。

通篇皆為重點內容,所有的內容都是圍繞雙親委派模型的原理展開的,需要學習者仔細品味案例,掌握雙親委派模型的原理。