第七章 虛擬機(jī)類加載機(jī)制

類加載機(jī)制:
虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存掠剑,并隊(duì)數(shù)據(jù)進(jìn)行校驗(yàn)糖赔,轉(zhuǎn)換解析和初始化慌洪,最終形成可以被虛擬機(jī)直接使用的Java類型株憾。

類生存過程:類加載-使用-卸載
類加載過程 : 加載-連接-初始化
連接過程: 驗(yàn)證-準(zhǔn)備-解析

過程說明

  • 加載
  1. 通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流.
  2. 將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu).
  3. 在內(nèi)存中生成一個(gè)代表這個(gè)類的Class對(duì)象,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)訪問入口.
  • 驗(yàn)證

為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身的安全.
文件格式驗(yàn)證,元數(shù)據(jù)驗(yàn)證,字節(jié)碼驗(yàn)證,符號(hào)引用驗(yàn)證.

  • 準(zhǔn)備

正式為類變量分配內(nèi)存并設(shè)置類變量(static 修飾的) 初始值,這些變量所使用的內(nèi)存都將在方法區(qū)中進(jìn)行分配.

class Test{
    int x ; // 對(duì)象實(shí)例化的時(shí)候會(huì)分配
    static int y =123; //準(zhǔn)備后為0, 初始化后為123
    static final int z = 123;//準(zhǔn)備后為123
}
  • 解析

    虛擬機(jī)將常量池內(nèi)的符號(hào)引用替換為直接引用.

  • 初始化

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

  • <clinit>()方法由編譯器自動(dòng)收集類中的所有類變量(static變量)的賦值動(dòng)作和static語句塊中的語句合并產(chǎn)生.

  • 虛擬機(jī)保證子類的<clinit>()執(zhí)行之前父類的已經(jīng)執(zhí)行完畢.

  • 虛擬機(jī)會(huì)保證一個(gè)類的<clinit>()方法在多線程的環(huán)境中被正確的加鎖,同步.

5種觸發(fā)初始化的情況:

  • new對(duì)象,read/write static field(except final static field), invoke static method计技,如果發(fā)現(xiàn)這個(gè)類沒有被加載過喜德;
  • java.lang.reflect反射的未初始化的類
  • 初始化一個(gè)類,如果他的父類未初始化過
  • 虛擬機(jī)啟動(dòng)時(shí)那個(gè)帶main方法的主類
  • 如果解析結(jié)果是REF_getStatic,REF_putSTatic,REF_invokeStatic垮媒,所對(duì)應(yīng)的類沒有初始化過

類中static初始化:
static字段和static語句塊按照先后順序被<clinit>()收集并執(zhí)行舍悯。父類的優(yōu)先于子類執(zhí)行。

public class SubCls extends Parent {

    static String sub_y = "sub static field y";

    static {
        System.out.println("sub static block");
        sub_x = "sub static block x";
        sub_y = "sub static block y";
        // System.out.println(sub_x); can not use the field after the block
    }

    static String sub_x = "sub static field x";

    public static void main(String[] args) {
        System.out.println(sub_x); // static field x
        System.out.println(sub_y); // y - static block
    }
}
class Parent {

    static String p_x = "parent static field x";

    static {
        System.out.println("parent static block");
        p_x = "parent static block x";
    }
}
parent static block
sub static block
sub static field x
sub static block y

雙親委派模型

工作過程:

如果一個(gè)類加載器收到了類加載的請(qǐng)求睡雇,它首先不會(huì)自己去嘗試加載這個(gè)類萌衬,而是把這個(gè)請(qǐng)求委派給父類加載器去完成。每一個(gè)層次的類加載器都是如此它抱。只有當(dāng)父類加載器反饋?zhàn)约簾o法完成這個(gè)加載請(qǐng)求時(shí)秕豫,子加載器才會(huì)嘗試自己去加載。

好處:

Java類隨著他的類加載器一起具備了一種帶有優(yōu)先級(jí)的層次關(guān)系观蓄。相反如果沒有使用雙親委派模型混移,由各個(gè)類加載器自行去加載的話,如果用戶編寫了一個(gè)稱為java.lang.Object的類侮穿,并防在ClassPath中歌径,那系統(tǒng)中將出現(xiàn)多個(gè)不同的Object類。

類加載器:

  • 啟動(dòng)類加載器(Bootstrap ClassLoader): C++ ; <JAVA_HOME>\lib
  • 擴(kuò)展類加載器(Extension ClassLoader):JAVA ;<JAVA_HOME>\lib\ext
  • 應(yīng)用程序類加載器(Application ClassLoader): JAVA ; ClassPath
  • 自定義類加載器(User ClassLoader)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亲茅,一起剝皮案震驚了整個(gè)濱河市回铛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌克锣,老刑警劉巖勺届,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異娶耍,居然都是意外死亡免姿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門榕酒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胚膊,“玉大人,你說我怎么就攤上這事想鹰∥赏瘢” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵辑舷,是天一觀的道長喻犁。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么肢础? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任还栓,我火速辦了婚禮,結(jié)果婚禮上传轰,老公的妹妹穿的比我還像新娘剩盒。我一直安慰自己,他們只是感情好慨蛙,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布辽聊。 她就那樣靜靜地躺著,像睡著了一般期贫。 火紅的嫁衣襯著肌膚如雪跟匆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天通砍,我揣著相機(jī)與錄音玛臂,去河邊找鬼。 笑死埠帕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玖绿。 我是一名探鬼主播敛瓷,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斑匪!你這毒婦竟也來了呐籽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蚀瘸,失蹤者是張志新(化名)和其女友劉穎狡蝶,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贮勃,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贪惹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寂嘉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奏瞬。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泉孩,靈堂內(nèi)的尸體忽然破棺而出硼端,到底是詐尸還是另有隱情,我是刑警寧澤寓搬,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布珍昨,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏镣典。R本人自食惡果不足惜兔毙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骆撇。 院中可真熱鬧瞒御,春花似錦、人聲如沸神郊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涌乳。三九已至蜻懦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夕晓,已是汗流浹背宛乃。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒸辆,地道東北人征炼。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像躬贡,于是被迫代替她去往敵國和親谆奥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 1概述 在Class文件中描述的各種信息拂玻,最終都需要加載到虛擬機(jī)中之后才能運(yùn)行和使用酸些。而虛擬機(jī)如何加載這些Clas...
    驪驊閱讀 396評(píng)論 0 1
  • 7.1概述 虛擬機(jī)把描述類的數(shù)據(jù)從class文件加載到內(nèi)存魄懂,經(jīng)過校驗(yàn)、轉(zhuǎn)換解析闯第、初始化市栗,最形成能夠被虛擬機(jī)直接使用...
    cremin閱讀 300評(píng)論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)咳短,斷路器肃廓,智...
    卡卡羅2017閱讀 134,707評(píng)論 18 139
  • 記不清這是哪一次約后街五個(gè)人開小灶了,那個(gè)時(shí)候五個(gè)人有一種神奇的魔力就是愛吃哪家哪家店就會(huì)消失诲泌,因?yàn)槲覀儛鄢缘亩际?..
    Yunkilady閱讀 247評(píng)論 0 0
  • 姓名:庹亞軍 公司:寧波貞觀電器有限公司 組別:第235期 利他一組 【日精進(jìn)打卡第 409天】 【知~學(xué)習(xí)】 看...
    tyj小電工閱讀 184評(píng)論 0 0