JVM類加載過程 & 雙親委派模型

JVM類加載過程 & 雙親委派模型

聲明

文章均爲本人技術筆記,轉載請註明出處https://segmentfault.com/u/yzwalljava

類加載過程

類加載機制:JVM將類描述數據從.class文件中加載到內存,並對數據進行,解析和初始化,最終造成被JVM直接使用的Java類型。
——《深刻理解Java虛擬機 JVM高級特性與最佳實踐》segmentfault

截圖來自《Java虛擬機精講》

  • 加載:加載階段由類加載器負責,過程見類加載器;spa

  • 驗證:驗證階段負責驗證類數據信息是否符合JVM規範,是不是一個有效的字節碼文件;.net

  • 準備:準備階段負責爲類中static變量分配空間,並初始化(與程序無關,系統初始化);設計

  • 解析:解析階段負責將常亮池中全部符號引用轉換爲直接引用;code

  • 初始化:初始化階段負責將全部static域按照程序指定操做對應執行(賦值static變量,執行static塊)對象

上述階段一般都是交叉混合容許,沒有嚴格的前後執行順序;blog


類加載器

<span id = "jump"></span>類加載器的主要任務:是類加載過程當中的加載操做根據一個類的全限定名讀取該類的二進制字節流到JVM內部,而後轉換爲一個對應的java.lang.Class對象實例
開發者能夠經過編寫自定義類加載器來自定義類的加載規則繼承

類加載器分類

啓動類加載器/Bootstrap ClassLoader

在HotSpot虛擬機中,Bootstrap ClassLoader用C++語言編寫並嵌入JVM內部,主要負載加載JAVA_HOME/lib目錄中的全部類,或者加載由選項-Xbootcalsspath指定的路徑下的類;內存

拓展類加載器/ExtClasLoader

ExtClassLoader繼承ClassLoader類,負載加載JAVA_HOME/lib/ext目錄中的全部類型,或者由參數-Xbootclasspath指定路徑中的全部類型;

應用程序類加載器/AppClassLoader

ExtClassLoader繼承ClassLoader類,負責加載用戶類路徑ClassPath下的全部類型,通常狀況下爲程序的默認類加載器;

自定義加載器

Java虛擬機規範將全部繼承抽象類java.lang.ClassLoader的類加載器,定義爲自定義類加載器


雙親委派模型

截圖來自《Java虛擬機精講》

截圖來自http://blog.csdn.net/zhangliangzi/article/details/51338291

雙親委派過程:當一個類加載器收到類加載任務時,當即將任務委派給它的父類加載器去執行,直至委派給最頂層的啓動類加載器爲止。若是父類加載器沒法加載委派給它的類時,將類加載任務退回給它的下一級加載器去執行;
除了啓動類加載器之外,每一個類加載器擁有一個父類加載器,用戶的自定義類加載器的父類加載器是AppClassLoader;
雙親委派模型能夠保證全限名指定的類,只被加載一次;
雙親委派模型不具備強制性約束,是Java設計者推薦的類加載器實現方式;


參考

[1] 《Java虛擬機精講》
[2] 《深刻理解Java虛擬機 JVM高級特性與最佳實踐》
[3]   http://blog.csdn.net/zhangliangzi/article/details/51338291

相關文章
相關標籤/搜索