深入理解Java類加載機制虽画,再也不用死記硬背了

談?wù)劇皶钡娜齻€層次

這里談?wù)勎依斫獾摹皶钡娜齻€層次:


第一層:了解這門語言的語法潜圃、寫法,我把它叫做 hello world 級別芥驳;

第二層:了解這門語言的優(yōu)劣勢以及它的生態(tài)柿冲,了解這門語言的能力范圍,我把它叫做?應(yīng)用 級別兆旬;

第三層:了解這門語言的底層運行機制假抄,這有利于對程序進行調(diào)優(yōu),以及當(dāng)程序遇到了比較罕見的問題時能夠從根上分析解決它丽猬。我把它叫做?掌握?級別宿饱。

在簡歷上寫掌握某種語言的,一般面試官也會問一些很深入原理的問題脚祟,個人認(rèn)為比較合理谬以。自己作為一個15年一線Java開發(fā),自認(rèn)為有資格把掌握J(rèn)ava寫在簡歷上由桌。今天为黎,我就來聊聊我對雙親委派機制一些理解。

Java類加載機制

首先我們需要思考一件事行您,我們編寫的Java代碼碍舍,是如何在各種各樣的操作系統(tǒng)上運行起來的。


Java文件通過Javac編譯成class文件邑雅,這種中間碼被稱為字節(jié)碼片橡。然后由JVM加載字節(jié)碼。這個過程就稱為類加載淮野。

運行時捧书,由解釋器將字節(jié)碼解釋為一行行的機器碼來執(zhí)行。在程序運行期間骤星,即時編譯器會針對熱點代碼经瓷,將該部分字節(jié)碼編譯成機器碼以獲取更高的執(zhí)行效率。在整個運行時洞难,解釋器和即時編譯器相互配合舆吮,使程序幾乎能達(dá)到和編譯型語言幾乎一樣的執(zhí)行速度。這個部分交給專業(yè)的編譯器開發(fā)人員來做队贱,咱們本篇不做深入講解色冀。

到此上面那張圖就講完了,不要問我右上角那兩個表情是怎么回事柱嫌。就是發(fā)現(xiàn)編輯的時候竟然可以添加表情锋恬,覺得好玩就試試看。

類的生命周期

在詳細(xì)講解之前编丘,我們明確一下類加載流程的目的与学。站在高處去看彤悔,就是把一份被javac編譯過的文件通過加載,生成某種形式的class文件的數(shù)據(jù)結(jié)構(gòu)送進內(nèi)存索守。程序可以調(diào)用這個數(shù)據(jù)結(jié)構(gòu)來構(gòu)造出Java對象晕窑。這個過程是在運行時進行的,也是Java動態(tài)拓展性的根基卵佛。



上面這張圖表現(xiàn)了類的整個生命周期幕屹。而類加載呢,只包含了加載级遭、鏈接和初始化三個階段望拖。加載只是類加載的第一個環(huán)節(jié),兩者要注意區(qū)分挫鸽。解析部分是靈活的说敏,它可以在初始化環(huán)節(jié)之前或者之后進行,實現(xiàn)后期綁定丢郊。類加載的其他環(huán)節(jié)的順序是不可改變的盔沫。

加載

加載是一個讀取class文件,將其轉(zhuǎn)化為某種靜態(tài)數(shù)據(jù)結(jié)構(gòu)而存儲在方法區(qū)內(nèi)枫匾,并在堆中生成一個便于用戶調(diào)用的Java對象的過程架诞。

這里值得注意的是,這個Java文件不一定是本地文件干茉,泛指各種來源的二進制流谴忧,比如網(wǎng)絡(luò)、數(shù)據(jù)庫或者比如動態(tài)代理技術(shù)這樣的即時生成的class文件角虫。

驗證

驗證的步驟很多沾谓,上面的圖畫得不完全準(zhǔn)確。對文件格式的校驗其實是發(fā)生在加載階段的戳鹅。通過才能順利加載均驶。順利加載并不代表JVM完全認(rèn)可了這個類,還要進行語法和語義上的分析枫虏,保證這個類不會危害JVM妇穴,這是對元數(shù)據(jù)和字節(jié)碼上的驗證。在解析階段隶债,還會進行符號引用的驗證腾它。隨著JVM版本的升高,驗證過程也在被不斷豐富燃异。

準(zhǔn)備

準(zhǔn)備就是為靜態(tài)變量賦初始值携狭,注意這里的初始值是JVM默認(rèn)初始值,是固定的回俐,不是咱們寫代碼時的那個初始值逛腿。這里有個比較容易混淆的概念。

Java內(nèi)存規(guī)范定義了方法區(qū)這種抽象概念仅颇。主流的JVM實現(xiàn)如HotSpot在JDK8之前使用永久代這種在堆中開辟專門空間的實現(xiàn)方式单默,JDK8之后使用元空間這種直接內(nèi)存取代。

HotSpot的實現(xiàn):類的元信息忘瓦、常量池搁廓、靜態(tài)變量等都存在在JDK8之前都存在在永久代這種方法區(qū)的具體實現(xiàn)中。JDK8之后耕皮,常量池境蜕、靜態(tài)變量被從方法區(qū)移除,轉(zhuǎn)移到了堆中凌停。元信息這些依然保留在方法區(qū)粱年,具體的存儲方式改成了元空間。

解析

解析是將符號引用替換為直接引用罚拟。

靜態(tài)解析

符號引用就是假如類A引用了類B台诗,加載階段是靜態(tài)解析,這時候B還沒有被放到JVM內(nèi)存中赐俗,這時候A引用的只是代表B的符號拉队,這是符號引用。

直接引用就是類A在解析階段發(fā)現(xiàn)自己引用了B阻逮,如果這個時候B還沒被加載粱快。就是直接觸發(fā)B的類加載,之后B的符號引用會被替換成實際地址叔扼。這被稱為直接引用皆尔。

動態(tài)解析

本文類的生命周期部分引出了后期綁定這個概念。后期綁定其實就是動態(tài)解析币励。如果代碼使用了多態(tài)慷蠕。B是一個抽象類或者接口,A就不能知道究竟要用哪個來替換食呻,只能等到實際發(fā)生調(diào)動時在進行實際地址的替換流炕。這就是為什么有的解析發(fā)生在初始化之后。

總結(jié)

類加載的過程今天就講這些仅胞。咱們來回顧一下類加載的五個階段每辟。


從JVM的角度看,加載的讀取二進制流和初始化階段干旧,是開放了主導(dǎo)權(quán)給用戶的渠欺。用戶可以使用動態(tài)代理等手段選擇是否這個階段進行加載。還可以使用多態(tài)的手段選擇是否在這個階段進行初始化椎眯。而剩下的所有部分都是JVM內(nèi)部完成的挠将。

此時你可以閉上眼睛回顧一下類加載的五個階段胳岂,是不是不用死記硬背也能了然于胸了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舔稀,一起剝皮案震驚了整個濱河市乳丰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌内贮,老刑警劉巖产园,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夜郁,居然都是意外死亡什燕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門竞端,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屎即,“玉大人,你說我怎么就攤上這事婶熬〗9矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵赵颅,是天一觀的道長虽另。 經(jīng)常有香客問我,道長饺谬,這世上最難降的妖魔是什么捂刺? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮募寨,結(jié)果婚禮上族展,老公的妹妹穿的比我還像新娘。我一直安慰自己拔鹰,他們只是感情好仪缸,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著列肢,像睡著了一般恰画。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓷马,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天拴还,我揣著相機與錄音,去河邊找鬼欧聘。 笑死片林,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播费封,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼焕妙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孝偎?” 一聲冷哼從身側(cè)響起访敌,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤凉敲,失蹤者是張志新(化名)和其女友劉穎衣盾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爷抓,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡势决,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蓝撇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片果复。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渤昌,靈堂內(nèi)的尸體忽然破棺而出虽抄,到底是詐尸還是另有隱情,我是刑警寧澤独柑,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布迈窟,位于F島的核電站,受9級特大地震影響忌栅,放射性物質(zhì)發(fā)生泄漏车酣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一索绪、第九天 我趴在偏房一處隱蔽的房頂上張望湖员。 院中可真熱鬧,春花似錦瑞驱、人聲如沸娘摔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凳寺。三九已至,卻和暖如春拴袭,著一層夾襖步出監(jiān)牢的瞬間读第,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工拥刻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怜瞒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像吴汪,于是被迫代替她去往敵國和親惠窄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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