文章均爲本人技術筆記,轉載請註明出處https://segmentfault.com/u/yzwalljava
類加載機制:JVM將類描述數據從.class文件中加載到內存,並對數據進行,解析和初始化,最終造成被JVM直接使用的Java類型。
——《深刻理解Java虛擬機 JVM高級特性與最佳實踐》segmentfault
加載:加載階段由類加載器負責,過程見類加載器;spa
驗證:驗證階段負責驗證類數據信息是否符合JVM規範,是不是一個有效的字節碼文件;.net
準備:準備階段負責爲類中static變量分配空間,並初始化(與程序無關,系統初始化);設計
解析:解析階段負責將常亮池中全部符號引用轉換爲直接引用;code
初始化:初始化階段負責將全部static域按照程序指定操做對應執行(賦值static變量,執行static塊)對象
上述階段一般都是交叉混合容許,沒有嚴格的前後執行順序;blog
<span id = "jump"></span>類加載器的主要任務:是類加載過程當中的加載操做:根據一個類的全限定名讀取該類的二進制字節流到JVM內部,而後轉換爲一個對應的java.lang.Class
對象實例;
開發者能夠經過編寫自定義類加載器來自定義類的加載規則繼承
在HotSpot虛擬機中,Bootstrap ClassLoader用C++語言編寫並嵌入JVM內部,主要負載加載JAVA_HOME/lib
目錄中的全部類,或者加載由選項-Xbootcalsspath
指定的路徑下的類;內存
ExtClassLoader繼承ClassLoader類,負載加載JAVA_HOME/lib/ext
目錄中的全部類型,或者由參數-Xbootclasspath
指定路徑中的全部類型;
ExtClassLoader繼承ClassLoader類,負責加載用戶類路徑ClassPath
下的全部類型,通常狀況下爲程序的默認類加載器;
Java虛擬機規範將全部繼承抽象類java.lang.ClassLoader的類加載器,定義爲自定義類加載器;
雙親委派過程:當一個類加載器收到類加載任務時,當即將任務委派給它的父類加載器去執行,直至委派給最頂層的啓動類加載器爲止。若是父類加載器沒法加載委派給它的類時,將類加載任務退回給它的下一級加載器去執行;
除了啓動類加載器之外,每一個類加載器擁有一個父類加載器,用戶的自定義類加載器的父類加載器是AppClassLoader;
雙親委派模型能夠保證全限名指定的類,只被加載一次;
雙親委派模型不具備強制性約束,是Java設計者推薦的類加載器實現方式;
[1] 《Java虛擬機精講》
[2] 《深刻理解Java虛擬機 JVM高級特性與最佳實踐》
[3] http://blog.csdn.net/zhangliangzi/article/details/51338291