類加載機制

類加載的過程

類加載的全過程论矾,加載剃允,驗證沛简,準備,解析和初始化這五個階段斥废。


加載

在加載階段椒楣,虛擬機需要完成以下三件事情:

  • 通過一個類的全限定名來獲取定義此類的二進制字節(jié)流
  • 將這個字節(jié)流所代表的靜態(tài)存儲結構轉換為方法區(qū)的運行時數(shù)據(jù)結構
  • 在Java堆中生成一個代表這個類的java.lang.Class對象,作為方法區(qū)這些數(shù)據(jù)的訪問入口

驗證

這一階段的目的是為了確保Class文件的字節(jié)流中包含的信息符合當前虛擬機的要求牡肉,并且不會危害虛擬機自身的安全捧灰。不同的虛擬機對類驗證的實現(xiàn)可能有所不同,但大致上都會完成下面四個階段的檢驗過程:文件格式驗證统锤、元數(shù)據(jù)驗證凤壁、字節(jié)碼驗證和符號引用驗證吩屹。

文件格式驗證

第一階段要驗證字節(jié)流是否符合Class文件格式的規(guī)范跪另,并且能被當前版本的虛擬機處理拧抖。

元數(shù)據(jù)驗證

第二階段是對字節(jié)碼描述的信息進行語義分析,以保證其描述的信息符合Java語言規(guī)范的要求免绿。

字節(jié)碼驗證

第三階段時整個驗證過程中最復雜的一個階段唧席,主要工作是數(shù)據(jù)流和控制流的分析。在第二階段對元數(shù)據(jù)信息中的數(shù)據(jù)類型做完校驗后嘲驾,這階段將對類的方法體進行校驗分析淌哟。這階段的任務是保證被校驗類的方法在運行時不會做出危害虛擬機安全的行為。

符號引用驗證

最后一個階段的校驗發(fā)生在虛擬機將符號引用直接轉化為直接引用的時候辽故,這個轉化動作將在連接的第三個階段-解析階段產生徒仓。符號引用驗證可以看作是對類自身以外(常量池中的各種符號引用)的信息進行匹配性的校驗。

準備

準備階段是正式為類變量分配內存并設置類變量初始值的階段誊垢,這些內存都將在方法區(qū)進行分配掉弛。

解析

解析階段是虛擬機將常量池的符號引用轉換為直接引用的過程。解析動作主要針對類或接口喂走、字段殃饿、類方法、接口方法四類符號引用進行芋肠。

  • 類或接口的解析
  • 字段解析
  • 類方法解析
  • 接口方法解析

初始化

前面的類加載過程中乎芳,除了在加載階段用戶應用程序可以通過自定義類加載器參與之外,其余動作完全由Java虛擬機主導和控制帖池。到了初始化階段奈惑,才真正開始執(zhí)行類中定義的Java程序代碼(或者說是字節(jié)碼)。在準備階段睡汹,變量已經(jīng)賦過一次系統(tǒng)要求的初始值肴甸,而在初始化階段,則是根據(jù)程序員通過程序制定的主觀計劃去初始化類變量和其他資源帮孔,或者說初始化階段是執(zhí)行類構造器<clinit>()方法的過程雷滋。

類加載器


類與類加載器

虛擬機設計團隊把類加載階段中的"通過一個類的全限定名來獲取描述此類的二進制字節(jié)流"這個動作放到Java虛擬機外部去實現(xiàn),以便讓程序自己決定如何去獲取所需的類文兢。實現(xiàn)這個動作的代碼模塊被稱為"類加載器"晤斩。

雙親委派模型

站在Java虛擬機的角度講,只存在兩種不同的類加載器:一種是啟動類加載器(Bootstrap ClassLoader)姆坚,這個類加載器使用C++語言實現(xiàn)澳泵,是虛擬機自身的一部分;另外一種就是所有其他的類加載器兼呵,這些類加載器都由Java語言實現(xiàn)兔辅,獨立于虛擬機外部腊敲,并且全部繼承自抽象類java.lang.ClassLoader。從Java開發(fā)人員的角度來看维苔,類加載器還可以分得更細致一些碰辅,絕大部分Java程序都會使用到以下三種系統(tǒng)提供的類加載器:

  • 啟動類加載器
  • 擴展類加載器
  • 應用程序類加載器
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市介时,隨后出現(xiàn)的幾起案子没宾,更是在濱河造成了極大的恐慌,老刑警劉巖沸柔,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件循衰,死亡現(xiàn)場離奇詭異,居然都是意外死亡褐澎,警方通過查閱死者的電腦和手機会钝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來工三,“玉大人迁酸,你說我怎么就攤上這事⊥襟。” “怎么了胁出?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長段审。 經(jīng)常有香客問我全蝶,道長,這世上最難降的妖魔是什么寺枉? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任抑淫,我火速辦了婚禮,結果婚禮上姥闪,老公的妹妹穿的比我還像新娘始苇。我一直安慰自己,他們只是感情好筐喳,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布催式。 她就那樣靜靜地躺著,像睡著了一般避归。 火紅的嫁衣襯著肌膚如雪荣月。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天梳毙,我揣著相機與錄音哺窄,去河邊找鬼。 笑死,一個胖子當著我的面吹牛萌业,可吹牛的內容都是我干的坷襟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼生年,長吁一口氣:“原來是場噩夢啊……” “哼婴程!你這毒婦竟也來了?” 一聲冷哼從身側響起晶框,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤排抬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后授段,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡番甩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年侵贵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缘薛。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡窍育,死狀恐怖,靈堂內的尸體忽然破棺而出宴胧,到底是詐尸還是另有隱情漱抓,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布恕齐,位于F島的核電站乞娄,受9級特大地震影響,放射性物質發(fā)生泄漏显歧。R本人自食惡果不足惜仪或,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望士骤。 院中可真熱鬧范删,春花似錦、人聲如沸拷肌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巨缘。三九已至添忘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間带猴,已是汗流浹背昔汉。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人靶病。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓会通,卻偏偏與公主長得像,于是被迫代替她去往敵國和親娄周。 傳聞我的和親對象是個殘疾皇子涕侈,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容

  • 什么是虛擬機的類加載機制?虛擬機把描述類的數(shù)據(jù)從Class文件加載到內存煤辨,并對數(shù)據(jù)進行校驗裳涛、轉換解析以及初始化,最...
    EakonZhao閱讀 2,320評論 6 22
  • 注:此文是我在讀完周志明老師的深入理解Java虛擬機之后總結的一篇文章众辨,請閱讀此書獲取更加詳細的信息. 類加載的時...
    AlstonWilliams閱讀 486評論 0 0
  • 讀書筆記 深入理解Java虛擬機:JVM高級特性與最佳實現(xiàn)(第二版) 概述 深入了解了Class文件存儲格式的具...
    Bollen_Chak閱讀 470評論 0 1
  • JVM類加載機制 概述 類加載過程 加載 通過類的全限定名獲取類的二進制流 將靜態(tài)存儲結構轉化為方法區(qū)的運行時數(shù)據(jù)...
    東溪95閱讀 3,025評論 0 15
  • 不經(jīng)一事不長一智端三,與其在事上悔青腸子,不如在事上反思覺察鹃彻,悔不當初自責不已郊闯,后悔藥吃不了兜著走,走過路過蛛株,切忌...
    郭相麟閱讀 234評論 0 0