淺談java classloader

類加載器三杰

jvm有三類classloader,分別是bootstrapclassloader,extendedclassloader以及systemclassloader箩做。

bootstrap classloader是系統(tǒng)在啟動(dòng)jvm時(shí)默認(rèn)加載的。當(dāng)用戶在命令行輸入java Test時(shí)靴寂,系統(tǒng)會(huì)首先加載jvm塘揣。在windows系統(tǒng)下辛掠,jvm的路徑通常位于%JAVA_HOME%/jdk/jre/client/jvm.dll和%JAVA_HOME%/jdk/jre/server/jvm.dll.

bootstrap classloader加載后弥激,會(huì)載入extended classloader进陡,并將extended classloader的父類設(shè)為bootstrap classloader。然后微服,bootstrap classloader接著載入system classloader趾疚,并將system classloader的父類設(shè)為extended classloader。至此以蕴,bootstrap--extended--system三級(jí)繼承結(jié)構(gòu)形成糙麦。

bootstrap classloader在jvm啟動(dòng)之后自動(dòng)加載。bootstrap ?classloader由c實(shí)現(xiàn)丛肮,不屬于java類喳资。

extended classloader由java實(shí)現(xiàn),通常為sun.misc.Lancher$ExtClassLoader.

system classloader由java實(shí)現(xiàn)腾供,通常為sun.misc.Lancher$AppClassLoader.

其中,

bootstrap classloader負(fù)責(zé)加載sun.boot.class.path路徑下的.class文件以及jar包。

extended classloader負(fù)責(zé)加載java.ext.dirs路徑下的.class文件以及jar包伴鳖。

system classloader負(fù)責(zé)加載java.class.path路徑下的.class文件以及jar包节值。

sun.boot.class.path通常對(duì)應(yīng)環(huán)境變量CLASSPATH的路徑。

java.ext.dirs通常對(duì)應(yīng)JAVA_HOME/jre/lib/ext目錄榜聂。

java.class.path對(duì)應(yīng)用戶自身的類路徑搞疗。

類加載到何處

據(jù)可靠情報(bào),jvm由方法區(qū)须肆,堆匿乃,棧,pc寄存器和本地方法棧構(gòu)成豌汇。類加載器的任務(wù)就是將class二進(jìn)制文件加載到方法區(qū)幢炸,供虛擬機(jī)模制出在堆中存放的對(duì)象。

雙親委托機(jī)制

classloader加載類的過程為:

1.檢查被加載類是否被加載拒贱。

2.如果沒有被加載則調(diào)用父classloader加載該類宛徊。

如果1、2不成功逻澳,則仍由自身進(jìn)行類加載闸天。

這種機(jī)制又叫雙親委派機(jī)制。

雙親委派機(jī)制的好處是斜做,避免多個(gè)類加載器加載同一個(gè)類的不同拷貝到內(nèi)存(jvm的方法區(qū))中苞氮。因?yàn)槿绻怉由ClassLoaderA加載,同時(shí)瓤逼,又被ClassLoaderB加載笼吟,這樣,內(nèi)存中就會(huì)存在兩份不同的A的定義抛姑,于是形成A既是ClassLoaderA罩的赞厕,又是ClassLoaderB罩著,造成災(zāi)難性后果定硝。

用戶自定義類的加載順序通常為:

首先調(diào)用AppClassLoader加載類皿桑,AppClassLoader調(diào)用ExtClassLoader,ExtClassLoader調(diào)用BootClassLoader蔬啡,BootClassLoader在sun.boot.class.path尋找改類诲侮,沒找到,加載失斚潴 沟绪;ExtClassLoader也未加載類,失敗空猜,最后由AppClassLoader加載成功绽慈。從這個(gè)加載順序可以看出來恨旱,三個(gè)類加載器的對(duì)類的可見性是不同的。

java中的類是由java的全名以及類的classloader來限定的坝疼。只有當(dāng)二者完全一樣才會(huì)認(rèn)為是同一個(gè)類搜贤。否則是不同的類。因此钝凶,可以定義一個(gè)同名的類仪芒,包名也一樣,只要保證該類被不同的類加載器加載即可耕陷。

當(dāng)前類加載器和線程上下文類加載器

當(dāng)前類加載器

當(dāng)前類加載器是指當(dāng)前方法所在的類使用的類加載器掂名。在程序中使用Class.forName或者Class.getResource抑或Class.class時(shí)就是使用的該類加載器。

線程上下文類加載器

線程上下文類加載器可以不遵循雙親委派機(jī)制哟沫。線程的上下文類加載器有Thread.currentThread().setContextClassLoader()來為當(dāng)前線程設(shè)置線程上下文類加載器饺蔑。如果沒有設(shè)置當(dāng)前線程的上下文類加載器,則繼承父類的上下文類加載器南用。

為什么還需要線程上下文類加載器膀钠?

考慮一種情況,當(dāng)我們的程序必須由jvm的核心代碼去加載第三方類的時(shí)候裹虫。比如jndi肿嘲,jndi的核心是rt.jar包中實(shí)現(xiàn)的,由Bootstrap classloader負(fù)責(zé)加載筑公,但是jndi必須加載第三方廠商的具體的jndi實(shí)現(xiàn)雳窟,這個(gè)時(shí)候調(diào)用Bootstrap加載只對(duì)其子類加載器可見的類,就會(huì)出現(xiàn)失敗匣屡。這個(gè)時(shí)候就可以使用線程上下文類加載器封救。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捣作,隨后出現(xiàn)的幾起案子誉结,更是在濱河造成了極大的恐慌,老刑警劉巖券躁,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惩坑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡也拜,警方通過查閱死者的電腦和手機(jī)以舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慢哈,“玉大人蔓钟,你說我怎么就攤上這事÷鸭” “怎么了滥沫?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵侣集,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我兰绣,道長(zhǎng)肚吏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任狭魂,我火速辦了婚禮,結(jié)果婚禮上党觅,老公的妹妹穿的比我還像新娘雌澄。我一直安慰自己,他們只是感情好杯瞻,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布镐牺。 她就那樣靜靜地躺著,像睡著了一般魁莉。 火紅的嫁衣襯著肌膚如雪睬涧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天旗唁,我揣著相機(jī)與錄音畦浓,去河邊找鬼。 笑死检疫,一個(gè)胖子當(dāng)著我的面吹牛讶请,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屎媳,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼夺溢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了烛谊?” 一聲冷哼從身側(cè)響起风响,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丹禀,沒想到半個(gè)月后状勤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡湃崩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年荧降,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攒读。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朵诫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薄扁,到底是詐尸還是另有隱情剪返,我是刑警寧澤废累,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站脱盲,受9級(jí)特大地震影響邑滨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钱反,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一掖看、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧面哥,春花似錦哎壳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吱涉,卻和暖如春刹泄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怎爵。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工特石, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疙咸。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓县匠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親撒轮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乞旦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Java8張圖 11、字符串不變性 12题山、equals()方法兰粉、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,709評(píng)論 0 11
  • ClassLoader翻譯過來就是類加載器顶瞳,普通的java開發(fā)者其實(shí)用到的不多玖姑,但對(duì)于某些框架開發(fā)者來說卻非常常見...
    時(shí)待吾閱讀 1,079評(píng)論 0 1
  • 0、前言 讀完本文慨菱,你將了解到: 一焰络、為什么說Jabalpur語言是跨平臺(tái)的 二、Java虛擬機(jī)啟動(dòng)符喝、加載類過程分...
    vivi_wong閱讀 1,235評(píng)論 0 10
  • 作者:成 富, 軟件工程師, IBM 中國(guó)軟件開發(fā)中心 類加載器(class loader)是 Java?中的一個(gè)...
    Android技術(shù)研究閱讀 3,907評(píng)論 0 74
  • 網(wǎng)絡(luò)協(xié)議 兩臺(tái)計(jì)算機(jī)要實(shí)現(xiàn)通訊必須遵守同一個(gè)規(guī)則,這就好比兩個(gè)人交流畏腕,只會(huì)英文和只會(huì)中文的因?yàn)闆]有共同的語言(規(guī)則...
    空白Null閱讀 2,185評(píng)論 0 4