天天看點

JVM--(一)

  • 類加載

    在Java代碼中,類型的加載、連結與初始化都是在程式運作期間完成的。提供了更大的靈活性,更加了更多可能。

  • Java虛拟機與程式的生命周期

    Java虛拟機結束生命周期:執行System.exit()方法;程式正常結束;程式執行過程遇到異常而異常終止;作業系統出現錯誤。

  • 類的加載、連結、初始化

    1、加載:查找并加載類的二進制資料。将類的.class檔案中的二進制資料讀入到記憶體中,将其放在運作時資料區的方法區内,然後在記憶體中建立一個Java.lang.class對象用來封裝類在方法區内的資料結構。Class對象封裝了類在方法區内的資料結構,并向Java程式員提供了通路方法區内的資料結構的接口。

    2、 連結:将已經讀入記憶體的類的二進制資料合并到虛拟機的運作時環境中。

    驗證、準備(為類的靜态變量配置設定記憶體,并初始化為預設值)、解析(在類型的常量池中尋找類、接口、字段和方法的符号引用,把類的符号引用轉換為直接引用)

    3、初始化:為類的靜态變量賦予正确的初始值,在變量聲明處和靜态代碼塊處初始化,按先後順序初始化

    當Java虛拟機初始化一個類時,要求其父類都被初始化,但不适用于接口。一個父接口不會因為它的子接口或者實作類的初始化而初始化,隻有當程式首次使用特定接口的靜态變量時,才會導緻該接口的初始化

    隻有當程式通路的靜态變量或靜态方法确實在目前類或目前接口中定義時,才可以認為是對類或接口的主動使用。

    調研ClassLoader類的loadClass方法加載一個類,不是對類的主動使用,不會導緻類的初始化

  • Java程式對類的使用與解除安裝

    1、 使用(主動與被動使用)

    所有Java虛拟機實作必須在每個類或借口被Java程式“首次主動使用”時在初始化類

    主動使用(7種):建立類的執行個體;通路靜态變量;調用靜态方法;反射;初始化其子類;啟動類;動态語言相關

    其他都為被動使用,不會導緻類的初始化

    2、解除安裝

    Class對象不再被引用時,就會結束生命周期,該類在方法區内的資料會被解除安裝。一個類何時結束其生命周期,取決于代表它的Class對象何時結束生命周期。隻有使用者自定義的類加載所加載的類是可以被解除安裝的。由虛拟機自帶的類加載器加載的類不會被解除安裝,因為虛拟機會始終引用這些類加載器,而這些類加載器會始終引用它們所加載的類的Class對象。

  • 類加載器

    1、根類加載器(Bootstrap)

    沒有父加載器,負責加載虛拟機的核心類庫。根類加載器從系統屬性sun.boot.class.path所指定的目錄中加載類庫。其實作依賴于底層作業系統。

    2、擴充類加載器(Extension)

    其父類加載器為根類加載器,從java.ext.dirs系統屬性指定的的目錄中加載類庫,或者從JDK安裝目錄的jre/lib/ext子目錄加載類庫。

    3、系統類加載器(System)

    它的父加載器為擴充類加載器。它從環境變量classpath或者系統屬性java.class.path所指定的目錄中加載類,它是使用者自定義的類加載器的預設父加載器

    4、使用者自定義加載器

    類加載器不用等到類“首次主動使用”才加載,可以在預料到某各類要被使用時預先加載。

    雙親委托機制能更好地保證Java平台的安全性。因為在此機制下,使用者自定義的類加載器不可能加載應由父加載器加載的可靠類,進而防止不可靠甚至惡意的代碼代替由父加載器加載器的可靠代碼。

  • 獲得ClassLoader的途徑

    獲得目前類的ClassLoader

    clazz.getClassLoader();

    獲得目前線程的上下文ClassLoader

    Thread.currentThread().getContextClassLoader();

    獲得系統的ClassLoader

    ClassLoader.getSystemClassLoader();

    獲得調用者的ClassLoader

    DriverManager.getCallerClassLoader();

  • 命名空間

    每個類加載器都擁有自己的命名空間,命名空間由該加載器及所有父加載器所加載的類組成。

    同一個命名空間中,不會出現類的完整名字相同的兩個類。

    不同的命名空間中,可以出現類的完整名字相同的兩個類。

    同一個命名空間的類互相可見,子加載器加載的類能看見父加載器加載的類,父加載器加載的類不能看見子加載器加載的類,兩個沒有關系的加載器加載的類互相不可見。

繼續閱讀