JVM類加載機(jī)制

流程

首先類加載在整個體系結(jié)構(gòu)的哪一個環(huán)節(jié)呢?見紅色圈住的部分。

image

類加載器分為那幾個過程呢?五個過程

image

加載
根據(jù)類的全限定名(簡單理解為類的絕對路徑,見附錄),找到指定的字節(jié)碼文件,并在內(nèi)存中生產(chǎn)一個java.lang.Class的對象,存放在方法區(qū)中。

驗證
作用:確保字節(jié)碼文件中包含的信息符合Class文件格式規(guī)范,對虛擬機(jī)來說是安全的。
規(guī)則一直在更新,大體有四種
1. 文件格式驗證 基于二進(jìn)制字節(jié)流進(jìn)行分析。
2. 元數(shù)據(jù)驗證(可以理解成是對類層面的信息驗證) 對類的元數(shù)據(jù)進(jìn)行語義分析。
3. 字節(jié)碼驗證(對方法層面的信息驗證)* 對方法體語義分析。
4. 符號引用驗證 驗證根據(jù)引用能否找到對應(yīng)的類、方法、字段。
如果確認(rèn)字節(jié)碼文件是安全的,通過 -Xverify:none 關(guān)閉大部分驗證。

準(zhǔn)備
在方法區(qū)中為類的靜態(tài)變量分配內(nèi)存并初始化。

解析
將常量池中的符號引用替換為直接引用的過程。

初始化
執(zhí)行類構(gòu)造器<client>方法,<client>方法是由編譯器自動收集的類中的類變量賦值操作和靜態(tài)語句塊中的語句。并且會保證父類的<client>方法先執(zhí)行。

加載過程由誰來執(zhí)行的

類加載器 classLoader,也就是 Java.lang.ClassLoader。核心函數(shù)是loadClass

protected synchronized Class<?> loadClass (String name,boolean resolve) throws ClassNotFoundException {
    // 首先檢查類是不是已經(jīng)被加載
    Class c = findLoadedClass(name);
    if (c == null) {
        try {
            if (parent != null) {
                //如果父類不為空,優(yōu)先檢查父類的
                c = parent.loadClass(name, false);
            } else { //否則檢查當(dāng)前的
                c = findBootstrapClass0(name);
            }
        } catch (ClassNotFoundException e) { // 如果還是找不到,就觸發(fā)子類本身的findClass方法去找
            c = findClass(name);
        }
    }
    if (resolve) {
        resolveClass(c);
    }
    return c;
}

類加載器

兩大類,四小種:JDK默認(rèn)提供的三種,用戶自定義的一種。

image

默認(rèn)的三種有(非繼承關(guān)系)

  • Bootstrap ClassLoader 啟動類加載器,沒有父類。

    • 一般是native code(C++)實現(xiàn)
    • 用于加載虛擬機(jī)的核心類(<JAVA_HOME>/jre/lib/rt.jar),包括擴(kuò)展類/系統(tǒng)類加載器
  • Extension ClassLoader 擴(kuò)展類加載器,父類加載器為空

    • java實現(xiàn),是rt.jar中sun.misc.Launcher的內(nèi)部類sun.misc.Launcher$ExtClassLoader (miscellaneous)
    • 用于加載擴(kuò)展庫中的類(<JAVA_HOME>/jre/lib/ext)
  • System ClassLoder 父類加載器Ext ClassLoader

    • java實現(xiàn),是rt.jar中sun.misc.Launcher的內(nèi)部類sun.misc.Launcher$AppClassLoader
    • 用于CLASS_PATH中的類

用戶自定義的有一種 父類是 System ClassLoader

  • 繼承自java.lang.ClassLoader

同名文件處理

這里有一個雙親委派的概念。就是當(dāng)查找一個類的時候,會一層一層的向上委托查詢,如果父類加載器有對應(yīng)的類,就直接從父類加載該類。

這樣的雙親委派有好處,但是有些場景我們是希望破壞雙親委派的

  • 場景一:我們想在頂層的classLoader中加載底層的classLoader

    • 可以在線程中放入底層的classLoader到Thread.setContextClassLoader()中,然后在頂層的classLoader中使用Thread.getContextClassLoader()加載第三方的classLoader實現(xiàn)。
  • 場景二:實現(xiàn)類熱部署

    • 一個class只能被一個classLoader加載一次,當(dāng)需要實現(xiàn)代碼熱部署的時候可以每次都new一個自定義的classLoader來加載新的Class文件。
  • 場景三:Tomcat中使用WebAppClassLoader進(jìn)行單獨加載,加載不了再去委托父加載器去加載。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,627評論 2 380

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