類的加載機制
主要關(guān)注點:
什么是類的加載
類的生命周期
類加載器
雙親委派模型
什么是類的加載
類的加載指的是將類的.class文件中的二進制數(shù)據(jù)讀入到內(nèi)存中嘉栓,將其放在運行時數(shù)據(jù)區(qū)的方法區(qū)內(nèi)蛉威,然后在堆區(qū)創(chuàng)建一個java.lang.Class對象,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)嗤谚。類的加載的最終產(chǎn)品是位于堆區(qū)中的Class對象,Class對象封裝了類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)扁瓢,并且向Java程序員提供了訪問方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)的接口炉菲。
類的生命周期
類的生命周期包括這幾個部分堕战,加載、連接拍霜、初始化嘱丢、使用和卸載,其中前三部是類的加載的過程,如下圖祠饺;
加載越驻,查找并加載類的二進制數(shù)據(jù),在Java堆中也創(chuàng)建一個java.lang.Class類的對象
連接,連接又包含三塊內(nèi)容:驗證缀旁、準備记劈、初始化。1)驗證并巍,文件格式目木、元數(shù)據(jù)、字節(jié)碼懊渡、符號引用驗證刽射;2)準備,為類的靜態(tài)變量分配內(nèi)存剃执,并將其初始化為默認值誓禁;3)解析,把類中的符號引用轉(zhuǎn)換為直接引用
初始化肾档,為類的靜態(tài)變量賦予正確的初始值
使用摹恰,new出對象程序中使用
卸載,執(zhí)行垃圾回收
幾個小問題怒见?
1俗慈、JVM初始化步驟 ? 2速种、類初始化時機 姜盈?3、哪幾種情況下配阵,Java虛擬機將結(jié)束生命周期?
答案參考這篇文章jvm系列(一):java類的加載機制
類加載器
啟動類加載器:Bootstrap ClassLoader示血,負責加載存放在JDK\jre\lib(JDK代表JDK的安裝目錄棋傍,下同)下,或被-Xbootclasspath參數(shù)指定的路徑中的难审,并且能被虛擬機識別的類庫
擴展類加載器:Extension ClassLoader瘫拣,該加載器由sun.misc.Launcher$ExtClassLoader實現(xiàn),它負責加載DK\jre\lib\ext目錄中告喊,或者由java.ext.dirs系統(tǒng)變量指定的路徑中的所有類庫(如javax.*開頭的類)麸拄,開發(fā)者可以直接使用擴展類加載器。
應用程序類加載器:Application ClassLoader黔姜,該類加載器由sun.misc.Launcher$AppClassLoader來實現(xiàn)拢切,它負責加載用戶類路徑(ClassPath)所指定的類,開發(fā)者可以直接使用該類加載器
類加載機制
全盤負責秆吵,當一個類加載器負責加載某個Class時淮椰,該Class所依賴的和引用的其他Class也將由該類加載器負責載入,除非顯示使用另外一個類加載器來載入
父類委托,先讓父類加載器試圖加載該類主穗,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類
緩存機制泻拦,緩存機制將會保證所有加載過的Class都會被緩存,當程序中需要使用某個Class時忽媒,類加載器先從緩存區(qū)尋找該Class争拐,只有緩存區(qū)不存在,系統(tǒng)才會讀取該類對應的二進制數(shù)據(jù)晦雨,并將其轉(zhuǎn)換成Class對象陆错,存入緩存區(qū)。這就是為什么修改了Class后金赦,必須重啟JVM音瓷,程序的修改才會生效