JVM類加載子系統

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

  JAVA虛擬機有兩種類裝載器:啓動類裝載器和用戶自定義類裝載器。前者是JAVA虛擬機實現的一部分,後者則是Java程序的一部分。由不同的類裝載器裝載的類將被放在虛擬機內部的不同命名空間中。

  類裝載器子系統涉及Java虛擬機的其他幾個組成部分,以及幾個來自java.lang庫的類。比如,用戶自定義的類裝載器是普通的Java對象,它的類必須派生自java.lang.ClassLoader類。ClassLoader中定義的方法爲程序提供了訪問類裝載器機制的接口。此外,對於每一個被裝載的類型,JAVA虛擬機都會爲它創建一個java.lang.Class類的實例來代表該類型。和所有其他對象一樣,用戶自定義的類裝載器以及Class類的實例都放在內存中的堆區,而裝載的類型信息則都位於方法區。

  類裝載器子系統除了要定位和導入二進制class文件外,還必須負責驗證被導入類的正確性,爲類變量分配並初始化內存,以及幫助解析符號引用。這些動作必須嚴格按以下順序進行:

  (1)裝載——查找並裝載類型的二進制數據。

  (2)連接——指向驗證、準備、以及解析(可選)。

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

    ● 準備  爲類變量分配內存,並將其初始化爲默認值。(這裏的準備和下面的初始化的順序問題體現在java初始化中值變化的各種陷阱)

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

  (3)初始化——把類變量初始化爲正確初始值。(準備的時候設爲默認值,此時纔會正式給變量賦值)

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

  每個類裝載器都有自己的命名空間,其中維護着由它裝載的類型。所以一個Java程序可以多次裝載具有同一個全限定名的多個類型。這樣一個類型的全限定名就不足以確定在一個Java虛擬機中的唯一性。因此,當多個類裝載器都裝載了同名的類型時,爲了惟一地標識該類型,還要在類型名稱前加上裝載該類型(指出它所位於的命名空間)的類裝載器標識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章