JVM加載class文件原理

裝載的概念

所謂裝載就是尋找一個類或是一個接口的二進制形式並用該二進制形式來構造表明這個類或是這個接口的class對象的過程。java

Java中類裝載器裝載類到虛擬機

在Java中,類裝載器把一個類裝入Java虛擬機中,要通過三個步驟來完成:裝載、連接和初始化,其中連接又能夠分紅校驗、準備、解析。bootstrap

  • 裝載:查找和導入類或接口的二進制數據;
  • 連接:執行下面的校驗、準備和解析步驟,其中解析步驟是能夠選擇的;
    • 校驗:檢查導入類或接口的二進制數據的正確性;
    • 準備:給類的靜態變量分配並初始化存儲空間;
    • 解析:將符號引用轉成直接引用;
  • 初始化:激活類的靜態變量的初始化Java代碼和靜態Java代碼塊。

JVM中類的裝載

JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。網絡

Java應用程序使用的類裝載器

一個Java應用程序使用兩種類型的類裝載器:根裝載器(bootstrap)和用戶定義的裝載器(user-defined)。jvm

  • 根裝載器以某種默認的方式將類裝入,包括那些Java API的類。在運行期間一個Java程序能安裝用戶本身定義的類裝載器。根裝載器是虛擬機固有的一部分。
  • 用戶定義的類裝載器則不是虛擬機固有的,它是用Java語言寫的,被編譯成class文件以後而後再被裝入到虛擬機,並像其它的任何對象同樣能夠被實例化。

Java類裝載器的體系結構以下所示:操作系統

Bootstrap(根裝載器)  
                |   
        Extension (擴展裝載器)  
                |  
             System  
                |  
              UserDefine1
                 /   \  
        UserDefine2  UserDefine3  
                            |   
                      UserDefine4

Java的類裝載模型

Java的類裝載模型是一種代理(delegation)模型。當JVM 要求類裝載器CL(ClassLoader)裝載一個類時,CL首先將這個類裝載請求轉發給他的父裝載器。代理

只有當父裝載器沒有裝載並沒有法裝載這個類時,CL纔得到裝載這個類的機會。這樣,全部類裝載器的代理關係構成了一種樹狀的關係。樹的根是類的根裝載器(bootstrap ClassLoader) ,在JVM中它以"null"表示。code

除根裝載器之外的類裝載器有且僅有一個父裝載器。在建立一個裝載器時,若是沒有顯式地給出父裝載器,那麼JVM將默認系統裝載器爲其父裝載器。對象

各類類裝載器詳細說明

下面針對各類類裝載器分別進行詳細的說明:繼承

  1. 根(Bootstrap)裝載器:該裝載器沒有父裝載器,它是JVM實現的一部分,從sun.boot.class.path裝載運行時庫的核心代碼。接口

  2. 擴展(Extension)裝載器:繼承的父裝載器爲根裝載器,不像根裝載器可能與運行時的操做系統有關,這個類裝載器是用純Java代碼實現的,它從java.ext.dirs (擴展目錄)中裝載代碼。

  3. 系統(System or Application)裝載器:裝載器爲擴展裝載器,咱們都知道在安裝JDK的時候要設置環境變量(CLASSPATH ),這個類裝載器就是從java.class.path(CLASSPATH 環境變量)中裝載代碼的,它也是用純Java代碼實現的,同時仍是用戶自定義類裝載器的缺省父裝載器。

  4. 小應用程序(Applet) 裝載器: 裝載器爲系統裝載器,它從用戶指定的網絡上的特定目錄裝載小應用程序代碼。

相關文章
相關標籤/搜索