一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

java基礎(chǔ):Q8. 類加載器的相關(guān)知識

 _王文波 2017-03-19
  • 類的加載

類的加載指的是將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中,將其放在運(yùn)行時數(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)的接口。

  • 加載器

看如下一個例子:

運(yùn)行結(jié)果為:

從如上代碼可以看到,我們總共獲取到了兩個classloader。而實(shí)際上并非只有兩個(啟動類加載器是不可見的)。如下圖為類加載的結(jié)構(gòu)圖:

注意:這里父類加載器并不是通過繼承關(guān)系來實(shí)現(xiàn)的,而是采用組合實(shí)現(xiàn)的。

從開發(fā)人員的角度來說,一般我們可以區(qū)分為4類類加載器,分別為:啟動類加載器,擴(kuò)展類加載器,應(yīng)用類加載器,自定義類加載器。

  1. 啟動類加載器Bootstrap ClassLoader,負(fù)責(zé)加載存放在JDK\jre\lib(JDK代表JDK的安裝目錄,下同)下,或被-Xbootclasspath參數(shù)指定的路徑中的,并且能被虛擬機(jī)識別的類庫(如rt.jar,所有的java.*開頭的類均被Bootstrap ClassLoader加載)。啟動類加載器是無法被Java程序直接引用的。
  2. 擴(kuò)展類加載器Extension ClassLoader,該加載器由sun.misc.Launcher$ExtClassLoader實(shí)現(xiàn),它負(fù)責(zé)加載DK\jre\lib\ext目錄中,或者由java.ext.dirs系統(tǒng)變量指定的路徑中的所有類庫(如javax.*開頭的類),開發(fā)者可以直接使用擴(kuò)展類加載器。
  3. 應(yīng)用程序類加載器:該類加載器由sun.misc.Launcher$AppClassLoader來實(shí)現(xiàn),它負(fù)責(zé)加載用戶類路徑(ClassPath)所指定的類,開發(fā)者可以直接使用該類加載器,如果應(yīng)用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認(rèn)的類加載器。
  4. 自定義類加載器:用戶自定義的類加載器。

注意:對于JVM來說,它只區(qū)分兩類類加載器

  1. 啟動類加載器:它是使用C++編寫的(僅限hotspot),它是java虛擬機(jī)的一部分
  2. 其他所有的類加載器。它是使用java寫的。這些類加載器都由Java語言實(shí)現(xiàn),獨(dú)立于虛擬機(jī)之外,并且全部繼承自抽象類java.lang.ClassLoader,這些類加載器需要由啟動類加載器加載到內(nèi)存中之后才能去加載其他的類。
  • JVM類加載機(jī)制
  1. 全盤負(fù)責(zé),當(dāng)一個類加載器負(fù)責(zé)加載某個Class時,該Class所依賴的和引用的其他Class也將由該類加載器負(fù)責(zé)載入,除非顯示使用另外一個類加載器來載入
  2. 父類委托,先讓父類加載器試圖加載該類,只有在父類加載器無法加載該類時才嘗試從自己的類路徑中加載該類
  3. 緩存機(jī)制,緩存機(jī)制將會保證所有加載過的Class都會被緩存,當(dāng)程序中需要使用某個Class時,類加載器先從緩存區(qū)尋找該Class,只有緩存區(qū)不存在,系統(tǒng)才會讀取該類對應(yīng)的二進(jìn)制數(shù)據(jù),并將其轉(zhuǎn)換成Class對象,存入緩存區(qū)。這就是為什么修改了Class后,必須重啟JVM,程序的修改才會生效
  • 雙親委派模型

雙親委派模型的工作流程是:如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把請求委托給父加載器去完成,依次向上,因此,所有的類加載請求最終都應(yīng)該被傳遞到頂層的啟動類加載器中,只有當(dāng)父加載器在它的搜索范圍中沒有找到所需的類時,即無法完成該加載,子加載器才會嘗試自己去加載該類。其加載機(jī)制如下:

  1. 當(dāng)AppClassLoader加載一個class時,它首先不會自己去嘗試加載這個類,而是把類加載請求委派給父類加載器ExtClassLoader去完成。
  2. 當(dāng)ExtClassLoader加載一個class時,它首先也不會自己去嘗試加載這個類,而是把類加載請求委派給BootStrapClassLoader去完成。
  3. 如果BootStrapClassLoader加載失?。ɡ缭?JAVA_HOME/jre/lib里未查找到該class),會使用ExtClassLoader來嘗試加載;
  4. 若ExtClassLoader也加載失敗,則會使用AppClassLoader來加載,如果AppClassLoader也加載失敗,則會報出異常ClassNotFoundException

可見,java類加載器是層級結(jié)構(gòu)的,當(dāng)需要加載一個類的時候,它實(shí)際上使用類似委托的方式委托其父加載器去加載該類,當(dāng)父類加載器無法找到該類的時候,才使用當(dāng)前類加載器加載。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    久久精品国产在热久久| 国产精品视频一级香蕉| 国产精品十八禁亚洲黄污免费观看| 亚洲一区二区欧美在线| 日韩和欧美的一区二区三区| 黄片在线观看一区二区三区| 国产精品免费自拍视频| 婷婷基地五月激情五月| 丰满人妻一二三区av| 国产亚洲欧美日韩精品一区| 91在线国内在线中文字幕| 九九九热在线免费视频| 亚洲国产av在线视频| 欧美野外在线刺激在线观看| 国产精品熟女在线视频| 最近最新中文字幕免费| 91偷拍与自偷拍精品| 五月天综合网五月天综合网| 夫妻激情视频一区二区三区| 久久国产亚洲精品赲碰热| 九九热这里只有精品视频| 日本精品中文字幕在线视频 | 伊人网免费在线观看高清版| 久久亚洲成熟女人毛片| 风间中文字幕亚洲一区| 国产欧美日韩精品一区二| 九九热这里只有免费精品| 亚洲av首页免费在线观看| 日本一区二区三区久久娇喘| 夜夜躁狠狠躁日日躁视频黑人| 亚洲欧美精品伊人久久| 日本高清中文精品在线不卡| 午夜视频成人在线观看| 欧美精品在线播放一区二区| 亚洲中文字幕亲近伦片| 超薄丝袜足一区二区三区| 欧美人妻少妇精品久久性色| 日本福利写真在线观看| 精品国产一区二区欧美| 视频在线免费观看你懂的| 精品国产品国语在线不卡|