JVM位置
JVM體系結構
類裝載器ClassLoader
類被裝載後的存放位置
- 方法區並不是存放方法的區域,其是存放類的描述信息(模板)的地方
- Class loader只是負責class文件的加載,Class loader有多種
- 加載之前是“小class”,加載之後就變成了“大Class”,這是安裝java.lang.Class模板生成了一個實例。“大Class”就裝載在方法區,模板實例化之後就得到n個相同的對象
- JVM並不是通過檢查文件後綴是不是
.class
來判斷是否需要加載的,而是通過文件開頭的特定文件標誌
類裝載器ClassLoader2
注意:
- Class loader有多種,可以說三個,也可以說是四個(第四個爲自己定義的加載器,繼承 ClassLoader),系統自帶的三個分別爲:
- 啓動類加載器(Bootstrap) ,C++所寫
- 擴展類加載器(Extension) ,Java所寫
- 應用程序類加載器(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出廠自帶的源代碼,而提供了一種“雙親委派”機制,保證“沙箱安全”。即先找到先使用。
執行引擎