如下是針對sun的hotspot,固然如今sun已被oracle收購java
Java在須要使用類的時候纔會將其載入,Java的類載入是由Classloader來執行的。mysql
如今以win下執行java xxx來說解下流程:sql
首先java執行文件會嘗試找到JRE安裝的所在目錄,而後尋找jvm.dll(預設是在JRE目錄下bin\client目錄中,好比C:\Java\jdk1.7.0_07\jre\bin\client\jvm.dll和C:\Java\jdk1.7.0_07\jre\bin\server\jvm.dll)oracle
接着啓動JVM並執行初始化動做,產生Bootstrap ClassLoadereclipse
Bootstrap Loader會載入Extended ClassLoader,並設定Extended ClassLoader的parent爲Bootstrap ClassLoaderjvm
接着Bootstrap ClassLoader會載入App ClassLoader(System ClassLoader),並將App ClassLoader的parent設定爲Extended ClassLoader。spa
接着App ClassLoader開始載入指定的類。注意這裏有個「雙親委派模型」的概念,就是在載入類時,都是先交於parent類ClassLoader去加載,若是找到了就直接 返回,不然才本身來加載,本身也加載不到就拋出ClassNotFoundException,見圖:.net
注意,這個三個ClassLoader類之間的父子關係(不是繼承關係),僅是語義上的關係,Extended ClassLoader 和 App ClassLoader都是java.net.URLClassLoader的子類。見code
public class ClassLoaderTest { public static void main(String[] args) { ClassLoaderTest ct = new ClassLoaderTest(); System.out.println(ct.getClass().getClassLoader()); //sun.misc.Launcher$AppClassLoader@1bbf1ca System.out.println(ct.getClass().getClassLoader().getParent()); //sun.misc.Launcher$ExtClassLoader@1ff0dde System.out.println(ct.getClass().getClassLoader().getParent().getParent()); // null // 因爲這些系統lib中的類是由BootStrap加載的,它並非一個類,因此沒法獲取ClassLoader System.out.println(System.class.getClassLoader()); // null //App ClassLoader的父類爲java.net.URLClassLoader System.out.println(ct.getClass().getClassLoader().getClass().getSuperclass().getName());//java.net.URLClassLoader //Extended ClassLoader的父類爲java.net.URLClassLoader System.out.println(ct.getClass().getClassLoader().getParent().getClass().getSuperclass().getName());//java.net.URLClassLoader } }
可見第8行爲null,由於Bootstrap ClassLoader是C++編寫server
可見JVM中默認的classloader有Bootstrap ClassLoader、Extended ClassLoader、App ClassLoader
Bootstrap ClassLoader:負責加載java基礎類,主要是 %JRE_HOME/lib/ 目錄下的jar和class,即系統參數sun.boot.class.path下的jar和類。System.getProperty("sun.boot.class.path")可查看詳細,我電腦顯示以下:
C:\Program Files (x86)\Java\jre7\lib\resources.jar;
C:\Program Files (x86)\Java\jre7\lib\rt.jar;
C:\Program Files (x86)\Java\jre7\lib\sunrsasign.jar;
C:\Program Files (x86)\Java\jre7\lib\jsse.jar;
C:\Program Files (x86)\Java\jre7\lib\jce.jar;
C:\Program Files (x86)\Java\jre7\lib\charsets.jar;
C:\Program Files (x86)\Java\jre7\lib\jfr.jar;
C:\Program Files (x86)\Java\jre7\classes
Extended ClassLoader:負責加載java擴展類,主要是 %JRE_HOME/lib/ext 目錄下的jar和class等,即系統參數java.ext.dirs下的jar和類,System.getProperty("java.ext.dirs")可查看詳細,我電腦顯示以下:
C:\Program Files (x86)\Java\jre7\lib\ext;
C:\Windows\Sun\Java\lib\ext
App ClassLoader:負責加載當前java應用的classpath中的全部類。即系統參數java.class.path下的jar和類,System.getProperty("java.class.path")可查看詳細,我電腦顯示以下:
D:\soft\eclipse\workspace\test\bin;
D:\soft\eclipse\workspace\test\lib\commons-logging-1.0.4.jar;
D:\soft\eclipse\workspace\test\lib\commons-cli-1.2.jar;
D:\soft\eclipse\workspace\test\lib\mysql-connector-java-5.1.28-bin.jar;
。。。
1