[Java][JVM]JVM體系結構 類裝載器ClassLoader  雙親委派機制

 

JVM位置

JVM體系結構

類裝載器ClassLoader

 

類被裝載後的存放位置

 

  • 方法區並不是存放方法的區域,其是存放類的描述信息(模板)的地方
  • Class loader只是負責class文件的加載,Class loader有多種
  • 加載之前是“小class”,加載之後就變成了“大Class”,這是安裝java.lang.Class模板生成了一個實例。“大Class”就裝載在方法區,模板實例化之後就得到n個相同的對象
  • JVM並不是通過檢查文件後綴是不是.class來判斷是否需要加載的,而是通過文件開頭的特定文件標誌

類裝載器ClassLoader2

注意:

  • Class loader有多種,可以說三個,也可以說是四個(第四個爲自己定義的加載器,繼承 ClassLoader),系統自帶的三個分別爲:
  1. 啓動類加載器(Bootstrap) ,C++所寫
  2. 擴展類加載器(Extension) ,Java所寫
  3. 應用程序類加載器(AppClassLoader)。

我們自己new的時候創建的是應用程序類加載器(AppClassLoader)。


public class  Test{
    //Test:查看類加載器
    public static void main(String[] args) {

        Object object = new Object();
        //查看是那個“ClassLoader”(快遞員把Object加載進來的)
        System.out.println(object.getClass().getClassLoader());
        //查看Object的加載器的上一層
        // error Exception in thread "main" java.lang.NullPointerException(已經是祖先了)
        //System.out.println(object.getClass().getClassLoader().getParent());

        System.out.println();

        Test t = new Test();
        System.out.println(t.getClass().getClassLoader().getParent().getParent());
        System.out.println(t.getClass().getClassLoader().getParent());
        System.out.println(t.getClass().getClassLoader());
    }
}

/*
*output:
* null
* 
* null
* sun.misc.Launcher$ExtClassLoader@4554617c
* sun.misc.Launcher$AppClassLoader@18b4aac2
* */

注意:

  • 如果是JDK自帶的類(Object、String、ArrayList等),其使用的加載器是Bootstrap加載器;如果自己寫的類,使用的是AppClassLoader加載器;Extension加載器是負責將把java更新的程序包的類加載進行
  • 輸出中,sun.misc.Launcher是JVM相關調用的入口程序
  • Java加載器個數爲3+1。前三個是系統自帶的,用戶可以定製類的加載方式,通過繼承Java. lang. ClassLoader

 雙親委派機制

注意:

  • 雙親委派機制:
    例如:需要用一個A.java這個類,首先去頂部Bootstrap根加載器去找,找得到你就用,找不到再下降一層,去Extension加載器去找,找得到就用,找不到再將一層,去AppClassLoader加載器去找,找得到就用,找不到就會報"CLASS NOT FOUND EXCEPTION"。
//測試加載器的加載順序
package java.lang;

public class String {

    public static void main(String[] args) {

        System.out.println("hello world!");

    }
}

/*
* output:
* 錯誤: 在類 java.lang.String 中找不到 main 方法
* */

 

上面代碼是爲了測試加載器的順序:首先加載的是Bootstrap加載器,由於JVM中有java.lang.String這個類,所以會首先加載這個類,而不是自己寫的類,而這個類中並無main方法,所以會報“在類 java.lang.String 中找不到 main 方法”。

這個問題就涉及到,如果有兩個相同的類,那麼java到底會用哪一個?如果使用用戶自己定義的java.lang.String,那麼別使用這個類的程序會去全部出錯,所以,爲了保證用戶寫的源代碼不污染java出廠自帶的源代碼,而提供了一種“雙親委派”機制,保證“沙箱安全”。即先找到先使用。

執行引擎



 

 

 

 

 

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