學(xué)習(xí)java、Android也有差不多半年時(shí)間了,是時(shí)候記錄一下學(xué)習(xí)過(guò)程中的心得和經(jīng)驗(yàn),這篇文章就是簡(jiǎn)單描述一下JVM加載class文件的機(jī)制。
Java中的類加載器實(shí)質(zhì)上也是類,功能是把類載入jvm中,值得注意的是jvm的類裝載器并不是一個(gè),而是三個(gè): 1. BootstrapLoader 啟動(dòng)類裝載器 : 每個(gè)Java虛擬機(jī)實(shí)現(xiàn)都必須有一個(gè)啟動(dòng)類裝載器。它只負(fù)責(zé)在系統(tǒng)類(核心Java API的class文件)的安裝路徑中查找要裝入的類。這個(gè)裝載器的實(shí)現(xiàn)由C++ 所撰寫(xiě)而成,是JVM實(shí)現(xiàn)的一部分。 2. ExtClassLoader 擴(kuò)展類裝載器:負(fù)責(zé)除核心Java API以外的其它c(diǎn)lass文件的裝載。例如、用于安裝或下載標(biāo)準(zhǔn)擴(kuò)展的class文件,在類路徑中發(fā)現(xiàn)的類庫(kù)的class文件,用于應(yīng)用程序運(yùn)行的class文件等等。 3. AppClassLoader 用戶自定義類裝載器:負(fù)責(zé)除核心Java API以外的其它c(diǎn)lass文件的裝載。這里有一點(diǎn)需要注意:自定義類裝載器并非由應(yīng)用程序員自己實(shí)現(xiàn),它也是JVM
當(dāng)我們使用命令來(lái)執(zhí)行某一個(gè)Java程序(比如Test.class)的時(shí)候:java Test (1) java.exe 會(huì)幫助我們找到 JRE ,接著找到位于 JRE 內(nèi)部的 jvm.dll ,這才是真正的 Java 虛擬機(jī)器 , 最后加載動(dòng)態(tài)庫(kù),激活 Java 虛擬機(jī)器。 (2) 虛擬機(jī)器激活以后,會(huì)先做一些初始化的動(dòng)作,比如說(shuō)讀取系統(tǒng)參數(shù)等。一旦初始化動(dòng)作完成之后,就會(huì)產(chǎn)生第一個(gè)類裝載器 ―― BootstrapLoader(啟動(dòng)類裝載器 ) 。 (3) Bootstrap Loader 所做的初始工作中,除了一些基本的初始化動(dòng)作之外,最重要的就是加載 Launcher.java 之中的 ExtClassLoader(擴(kuò)展類裝載器) ,并設(shè)定其 Parent 為 null ,代表其父加載器為 BootstrapLoader 。 (4) 然后 Bootstrap Loader 再要求加載 Launcher.java 之中的 AppClassLoader(用戶自定義類裝載器 ) ,并設(shè)定其 Parent 為之前產(chǎn)生的 ExtClassLoader 實(shí)體。這兩個(gè)加載器都是以靜態(tài)類的形式存在的。這里要注意的是, Launcher
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注