寫在前面
知其然知其所以然,從事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>
類加載機(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è)步驟猛遍,他們之間的順序如下圖:
加載:主要工作是將類的二進(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
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疆虚,“玉大人苛败,你說(shuō)我怎么就攤上這事【恫荆” “怎么了罢屈?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)牍帚。 經(jīng)常有香客問(wèn)我儡遮,道長(zhǎng)乳蛾,這世上最難降的妖魔是什么暗赶? 我笑而不...
- 正文 為了忘掉前任鄙币,我火速辦了婚禮,結(jié)果婚禮上蹂随,老公的妹妹穿的比我還像新娘十嘿。我一直安慰自己岳锁,他們只是感情好激率,可當(dāng)我...
- 文/花漫 我一把揭開白布嘉冒。 她就那樣靜靜地躺著顶籽,像睡著了一般礼饱。 火紅的嫁衣襯著肌膚如雪慨仿。 梳的紋絲不亂的頭發(fā)上跑慕,一...
- 那天,我揣著相機(jī)與錄音,去河邊找鬼位岔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妖胀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
- 文/蒼蘭香墨 我猛地睜開眼吼和,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼炫乓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起献丑,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤末捣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后创橄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箩做,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年妥畏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邦邦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響氏身,放射性物質(zhì)發(fā)生泄漏巍棱。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一观谦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桨菜,春花似錦豁状、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至霞掺,卻和暖如春谊路,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菩彬。 一陣腳步聲響...
- 正文 我出身青樓惨恭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親耙旦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脱羡,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司免都,掛了不少锉罐,但最終還是拿到小米、百度绕娘、阿里脓规、京東、新浪险领、CVTE抖拦、樂(lè)視家的研發(fā)崗...
- Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)舷暮,斷路器态罪,智...
- 原文鏈接:http://iaspecwang.iteye.com/blog/1931043 一.概述 定義:虛擬機(jī)...
- 18k日本彈力環(huán)戒6mm松石+8mm蜜蠟價(jià)格488一枚用的都是訂做的半孔珠子,成色都是棒棒噠耗啦,出來(lái)的效果當(dāng)然不會(huì)失望凿菩。
- 一衅谷、奇跡 1、當(dāng)我全然信任我是被宇宙深深的愛的時(shí)候似将,所有事所有人都來(lái)服務(wù)我获黔,沒帶門卡,但就顯化人來(lái)給我開門在验,搬東西...