四、JVM之類加載

虛擬機(jī)如何加載Class文件蓖租?
Class文件中的信息進(jìn)入到虛擬機(jī)后會發(fā)生什么變化粱侣?
虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗(yàn)蓖宦、轉(zhuǎn)換解析和初始化齐婴,最終形成可以被虛擬機(jī)直接使用的Java類型,這就是虛擬機(jī)的類加載機(jī)制稠茂。

類的生命周期

何時(shí)加載?

    1. 遇到new柠偶、getstatic、putstatic或invokestatic這4條字節(jié)碼指令時(shí),如果類沒有進(jìn)行過初始化诱担,則需要先觸發(fā)初始化毡证。
      場景:new 實(shí)例化對象時(shí)候、讀取或設(shè)置一個(gè)類的靜態(tài)字段的時(shí)候蔫仙,以及調(diào)用一個(gè)類的靜態(tài)方法的時(shí)候料睛。
  • 2)使用java.lang.reflect包的方法對類進(jìn)行反射調(diào)用的時(shí)候,如果類沒有進(jìn)行過初始化匀哄,則需要先觸發(fā)期初始化秦效。
  • 3)當(dāng)初始化一個(gè)類的時(shí)候,如果發(fā)現(xiàn)其父類還沒有進(jìn)行過初始化涎嚼,則需要先觸發(fā)其父類的初始化阱州。
  • 4)當(dāng)虛擬機(jī)啟動時(shí),用戶需要指定一個(gè)要執(zhí)行的主類(包含main()方法的那個(gè)類)法梯,虛擬機(jī)會先初始化這個(gè)主類苔货。
  • 5)當(dāng)使用JDK1.7的動態(tài)語言支持的,如果一個(gè)java.lang.invoke.MethodHandle實(shí)例最后的解析結(jié)果REF_getStatic立哑、REF_putStatic夜惭、REF_invokeStatic的方法句柄,并且這個(gè)方法句柄所對應(yīng)的類沒有進(jìn)行初始化铛绰,則需要先觸發(fā)其初始化诈茧。

類加載過程

1.加載

在該階段,虛擬機(jī)需要完成以下3件事情:

  • 1)通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流
  • 2)將這個(gè)字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)捂掰。
  • 3)在內(nèi)存中生成一個(gè)代表這個(gè)類的java.lang.Class對象敢会,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)的訪問入口。
    獲取類的二進(jìn)制字節(jié)流是開發(fā)人員可控性最強(qiáng)的这嚣,開發(fā)人員可以定義自己的類加載器去控制字節(jié)流的獲取方式(重寫loadClass()方法)鸥昏。
    數(shù)組類加載
  • 1)如果數(shù)組的組件類型是引用類型,則遞歸加載這個(gè)組件類型姐帚,數(shù)組將在加載該組件類型的類加載器的類名稱空間上被標(biāo)識
  • 2)如果數(shù)組的組件類型不是引用類型(如int[]數(shù)組)吏垮,Java虛擬機(jī)將會把數(shù)組標(biāo)記與引導(dǎo)類加載器關(guān)聯(lián)。
  • 3)數(shù)組類的可見性與它的組件類型的可見性一致罐旗,如果組件類型不是引用類型膳汪,那數(shù)組類的可見性將默認(rèn)為public。

2.驗(yàn)證

驗(yàn)證是連接階段的第一步九秀,這階段的目的是為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求遗嗽,并且不會危害虛擬機(jī)自身的安全。

  • 1)文件格式驗(yàn)證
  • 2)元數(shù)據(jù)驗(yàn)證
  • 3)字節(jié)碼驗(yàn)證
  • 4)符號引用驗(yàn)證

3.準(zhǔn)備

準(zhǔn)備階段是正式為類變量分配內(nèi)存設(shè)置類變量初始值的階段颤霎,這些變量所使用的內(nèi)存都將在方法區(qū)中進(jìn)行分配。

數(shù)據(jù)類型 零值
int 0
long 0L
short (short)0
char '\u0000'
byte (byte)0
boolean false
float 0.0f
double 0.0d
reference null

4.解析

解析階段是虛擬機(jī)將常量池內(nèi)的符號引用替換為直接引用的過程。

  • 符號引用:以一組符號來描述所引用的目標(biāo)友酱,符號可以是任何形式的字面量晴音,只要使用時(shí)能無歧義地定位到目標(biāo)即可。
  • 直接引用:可以是直接指向目標(biāo)的指針缔杉、相對偏移量或是一個(gè)能間接定位到目標(biāo)的句柄锤躁。
  • 1)類或接口的解析
  • 2)字段解析
  • 3)類方法解析
  • 4)接口方法解析

5初始化

初始化階段是執(zhí)行類構(gòu)造器<clinit>()方法的過程。

類加載器

類加載器實(shí)現(xiàn)的是類加載過程中的第一步“通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流”或详。類加載器在類的層次劃分系羞、OSGi、熱部署霸琴、代碼加密等領(lǐng)域大放異彩椒振。
對于任意一個(gè)類,都需要由加載它的類加載器和這個(gè)類本身一同確立其在Java虛擬機(jī)中的唯一性梧乘,每一個(gè)類加載器澎迎,都擁有一個(gè)獨(dú)立的類名稱空間。

1.雙親委派模型
  • 1)啟動類加載器(Bootstrap ClassLoader)一般加載類庫
  • 2)擴(kuò)展類加載器(Extension ClassLoader)一般加載擴(kuò)展庫
  • 3)應(yīng)用程序類加載器(Application ClassLoader)
classloader.png

父子之間的關(guān)系一般不會用繼承的關(guān)系來實(shí)現(xiàn)选调,而是都使用組合關(guān)系來復(fù)用父加載器的代碼夹供。
雙親委派模型的工作過程是:如果一個(gè)類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個(gè)類仁堪,而是把這個(gè)請求委派給父類加載器去完成哮洽,每一層次的類加載器都是如此,因此所有的加載請求最終都應(yīng)該傳遞到頂層的啟動類加載器中弦聂,只有當(dāng)父加載器反饋?zhàn)约簾o法完成這個(gè)請求時(shí)鸟辅,子加載器才會去嘗試自己去加載。

2.破壞雙親委派模型

OSGi中對類加載器的使用時(shí)很值得學(xué)習(xí)的横浑,弄懂了OSGi的實(shí)現(xiàn)剔桨,就可以算是掌握了類加載的精髓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徙融,一起剝皮案震驚了整個(gè)濱河市洒缀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欺冀,老刑警劉巖树绩,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隐轩,居然都是意外死亡饺饭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門职车,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘫俊,“玉大人鹊杖,你說我怎么就攤上這事】秆浚” “怎么了骂蓖?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長川尖。 經(jīng)常有香客問我登下,道長,這世上最難降的妖魔是什么叮喳? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任被芳,我火速辦了婚禮,結(jié)果婚禮上馍悟,老公的妹妹穿的比我還像新娘畔濒。我一直安慰自己,他們只是感情好赋朦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布篓冲。 她就那樣靜靜地躺著,像睡著了一般宠哄。 火紅的嫁衣襯著肌膚如雪壹将。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天毛嫉,我揣著相機(jī)與錄音诽俯,去河邊找鬼。 笑死承粤,一個(gè)胖子當(dāng)著我的面吹牛暴区,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辛臊,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仙粱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了彻舰?” 一聲冷哼從身側(cè)響起伐割,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刃唤,沒想到半個(gè)月后隔心,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尚胞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年硬霍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笼裳。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唯卖,死狀恐怖粱玲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拜轨,我是刑警寧澤密幔,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站撩轰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏昧廷。R本人自食惡果不足惜堪嫂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望木柬。 院中可真熱鬧皆串,春花似錦、人聲如沸眉枕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽速挑。三九已至谤牡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姥宝,已是汗流浹背翅萤。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腊满,地道東北人套么。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像碳蛋,于是被迫代替她去往敵國和親胚泌。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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