天天看點

JVM的類裝載子系統

  在JAVA虛拟機中,負責查找并裝載類型的那部分被稱為類裝載子系統。

  JAVA虛拟機有兩種類裝載器:啟動類裝載器和使用者自定義類裝載器。前者是JAVA虛拟機實作的一部分,後者則是Java程式的一部分。由不同的類裝載器裝載的類将被放在虛拟機内部的不同命名空間中。

  類裝載器子系統涉及Java虛拟機的其他幾個組成部分,以及幾個來自java.lang庫的類。比如,使用者自定義的類裝載器是普通的Java對象,它的類必須派生自java.lang.ClassLoader類。ClassLoader中定義的方法為程式提供了通路類裝載器機制的接口。此外,對于每一個被裝載的類型,JAVA虛拟機都會為它建立一個java.lang.Class類的執行個體來代表該類型。和所有其他對象一樣,使用者自定義的類裝載器以及Class類的執行個體都放在記憶體中的堆區,而裝載的類型資訊則都位于方法區。

  類裝載器子系統除了要定位和導入二進制class檔案外,還必須負責驗證被導入類的正确性,為類變量配置設定并初始化記憶體,以及幫助解析符号引用。這些動作必須嚴格按以下順序進行:

    ● 驗證  確定被導入類型的正确性。(java可以自定義安全政策等)

    ● 準備  為類變量配置設定記憶體,并将其初始化為預設值。(這裡的準備和下面的初始化的順序問題展現在java初始化中值變化的各種陷阱)

    ● 解析  把類型中的符号引用轉換為直接引用。

  每個JAVA虛拟機實作都必須有一個啟動類裝載器,它知道怎麼裝載受信任的類。

  每個類裝載器都有自己的命名空間,其中維護着由它裝載的類型。是以一個Java程式可以多次裝載具有同一個全限定名的多個類型。這樣一個類型的全限定名就不足以确定在一個Java虛拟機中的唯一性。是以,當多個類裝載器都裝載了同名的類型時,為了惟一地辨別該類型,還要在類型名稱前加上裝載該類型(指出它所位于的命名空間)的類裝載器辨別。