Java類裝載解析

寫在前面

知其然知其所以然,從事Java將近五年來(lái),雖然做過(guò)不少項(xiàng)目泥从,也看過(guò)不少Java理論相關(guān)的文章和書籍,但是對(duì)Java關(guān)于類加載的機(jī)制卻不甚了解沪摄。借此文章梳理下躯嫉。

背景知識(shí)

首先我們要了解JVM是干嘛的,他在Java世界中充當(dāng)?shù)慕巧鞘裁囱罟眨縅VM是java的核心和基礎(chǔ)祈餐,在java編譯器和os平臺(tái)之間的虛擬處理器。JVM通過(guò)將class二進(jìn)制文件的虛擬指令集編譯為實(shí)際的CPU指令集哄陶。

class二進(jìn)制文件包含了JAVA虛擬機(jī)指令集和符號(hào)表帆阳,還有其他的一些輔助信息。

JVM解釋過(guò)來(lái)就是Java虛擬機(jī)屋吨,它最重要的一個(gè)特點(diǎn)就是平臺(tái)無(wú)關(guān)性蜒谤,解釋過(guò)來(lái)就是不同平臺(tái)的操作系統(tǒng)(linux,windows)至扰,通過(guò)jvm都可以將字節(jié)碼翻譯成平臺(tái)的指令鳍徽。下面這張圖很好的解釋了JVM的作用和充當(dāng)?shù)慕巧?/p>

JVM充當(dāng)?shù)慕巧?/div>

類加載機(jī)制

類的加載分為兩種:

隱式加載:我們通常使用的new關(guān)鍵字就是調(diào)用jvm的隱式加載機(jī)制,這種機(jī)制對(duì)開發(fā)人員來(lái)說(shuō)是透明的渊胸。

顯式加載:通過(guò)class.forName()等方法旬盯,顯式加載需要的類 台妆。

Java是動(dòng)態(tài)加載類的翎猛,只要在需要用到類的時(shí)候才會(huì)有JVM加載到內(nèi)存中,這種方式的好處節(jié)省內(nèi)存空間接剩。

雙親委派

我們?cè)诩虞d一個(gè)類的時(shí)候切厘,如何保證這個(gè)類不重復(fù)被加載?自己加載自己需要的類懊缺?顯然不是的疫稿,如果自己加載需要的類培他,那么內(nèi)存中會(huì)有大量類被重復(fù)加載,沒法保證類的唯一性遗座。

關(guān)于雙親委派的模式舀凛,大家可以參考相關(guān)的文章,這里不再贅述途蒋。雙親委派

加載步驟

一個(gè)類的加載主要分為七個(gè)步驟猛遍,他們之間的順序如下圖:

類加載過(guò)程

加載:主要工作是將類的二進(jìn)制字節(jié)流到JVM內(nèi)部,并存儲(chǔ)在運(yùn)行時(shí)內(nèi)存區(qū)的方法區(qū)号坡,然后將其轉(zhuǎn)換為一個(gè)與目標(biāo)類型對(duì)應(yīng)的java.lang.Class對(duì)象實(shí)例(jdk1.8方法區(qū)改為Metaspace實(shí)現(xiàn))懊烤,這個(gè)Class對(duì)象在日后就會(huì)作為方法區(qū)中該類的各種數(shù)據(jù)的訪問(wèn)入口。

驗(yàn)證:負(fù)責(zé)對(duì)字節(jié)流進(jìn)行驗(yàn)證宽堆,是否符合jvm的規(guī)范要求腌紧,是否有影響jvm的運(yùn)行穩(wěn)定性。驗(yàn)證內(nèi)容涵蓋了類數(shù)據(jù)信息的格式驗(yàn)證畜隶、語(yǔ)義分析壁肋、操作驗(yàn)證等

格式驗(yàn)證:驗(yàn)證是否符合class文件規(guī)范

語(yǔ)義驗(yàn)證:檢查一個(gè)被標(biāo)記為final的類型是否包含子類;檢查一個(gè)類中的final方法視頻被子類進(jìn)行重寫代箭;確保父類和子類之間沒有不兼容的一些方法聲明(比如方法簽名相同墩划,但方法的返回值不同)

操作驗(yàn)證:在操作數(shù)棧中的數(shù)據(jù)必須進(jìn)行正確的操作,對(duì)常量池中的各種符號(hào)引用執(zhí)行驗(yàn)證(通常在解析階段執(zhí)行嗡综,檢查是否通過(guò)富豪引用中描述的全限定名定位到指定類型上乙帮,以及類成員信息的訪問(wèn)修飾符是否允許訪問(wèn)等)

準(zhǔn)備:準(zhǔn)備階段是正式為類變量分配內(nèi)存并設(shè)置類變量初始值的階段,這些內(nèi)存都將在方法區(qū)中分配极景。這個(gè)時(shí)候并不是賦值察净,只是在內(nèi)存中為變量分配空間和初始值。

對(duì)于該階段有以下幾點(diǎn)需要注意:

這時(shí)候進(jìn)行內(nèi)存分配的僅包括類變量(static)盼樟,而不包括實(shí)例變量氢卡,實(shí)例變量會(huì)在對(duì)象實(shí)例化時(shí)隨著對(duì)象一塊分配在 Java 堆中。這里隨著JVM的版本不同晨缴,放的位置不同译秦,1.6中放在永久代Perm中,1.7會(huì)放在堆空間中開辟击碗,1.8改到了元空間筑悴。

這里所設(shè)置的初始值通常情況下是數(shù)據(jù)類型默認(rèn)的零值(如 0、0L稍途、null阁吝、false 等),而不是被在 Java 代碼中被顯式地賦予的值械拍。

解析:解析階段是虛擬機(jī)將常量池中的符號(hào)引用轉(zhuǎn)化為直接引用的過(guò)程突勇。

初始化:初始化是類加載過(guò)程的最后一步装盯,到了此階段,才真正開始執(zhí)行類中定義的 Java 程序代碼甲馋。上面的準(zhǔn)備階段已經(jīng)為類分配了內(nèi)存空間和初始值埂奈,這里初始化就是根據(jù)程序指定的主觀計(jì)劃去初始化類變量和其他資源,或者可以從另一個(gè)角度來(lái)表達(dá):初始化階段是執(zhí)行類構(gòu)造器()方法的過(guò)程定躏。

使用:以上步驟全部完成之后挥转,這個(gè)類就可以被使用了。

卸載:在使用結(jié)束之后共屈,需要將類卸載绑谣。

加載的時(shí)候我們知道在內(nèi)存中會(huì)有一個(gè)java.lang.Class與目標(biāo)類對(duì)應(yīng)。當(dāng)代表A類的Class對(duì)象不再被引用拗引,即不可觸及時(shí)借宵,Class對(duì)象就會(huì)結(jié)束生命周期,A類在方法區(qū)內(nèi)的數(shù)據(jù)也會(huì)被卸載矾削,從而結(jié)束A類的生命周期壤玫。由此可見,一個(gè)類何時(shí)結(jié)束生命周期哼凯,取決于代表它的Class對(duì)象何時(shí)結(jié)束生命周期欲间。


參考文檔https://www.cnblogs.com/Qian123/p/5707562.html

? ? ? ? ? ? ? ? ? https://baike.baidu.com/item/JVM/2902369?fr=aladdin

? ? ? ? ? ? ? ? ? https://www.cnblogs.com/xiaoxian1369/p/5498817.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市断部,隨后出現(xiàn)的幾起案子猎贴,更是在濱河造成了極大的恐慌,老刑警劉巖蝴光,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件她渴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蔑祟,警方通過(guò)查閱死者的電腦和手機(jī)趁耗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疆虚,“玉大人苛败,你說(shuō)我怎么就攤上這事【恫荆” “怎么了罢屈?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)牍帚。 經(jīng)常有香客問(wèn)我儡遮,道長(zhǎng)乳蛾,這世上最難降的妖魔是什么暗赶? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任鄙币,我火速辦了婚禮,結(jié)果婚禮上蹂随,老公的妹妹穿的比我還像新娘十嘿。我一直安慰自己岳锁,他們只是感情好激率,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布嘉冒。 她就那樣靜靜地躺著顶籽,像睡著了一般礼饱。 火紅的嫁衣襯著肌膚如雪慨仿。 梳的紋絲不亂的頭發(fā)上跑慕,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼位岔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妖胀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼吼和,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼炫乓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起献丑,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤末捣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后创橄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箩做,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年妥畏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邦邦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡醉蚁,死狀恐怖燃辖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情网棍,我是刑警寧澤黔龟,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響氏身,放射性物質(zhì)發(fā)生泄漏巍棱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一观谦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桨菜,春花似錦豁状、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至霞掺,卻和暖如春谊路,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菩彬。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工缠劝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骗灶。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓惨恭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耙旦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脱羡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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