類加載機(jī)制

定義

虛擬機(jī)把描述類的數(shù)據(jù)從Class文件中加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化陆淀,最終形成可以被虛擬機(jī)直接使用的Java類型,這就是虛擬機(jī)的類加載機(jī)制先嬉。

生命周期

類從被加載到虛擬機(jī)內(nèi)存開始轧苫,到卸載出內(nèi)存為止,整個生命周期包括:加載疫蔓、鏈接含懊、初始化、使用衅胀、卸載岔乔,其中鏈接又包括驗(yàn)證、準(zhǔn)備滚躯、解析雏门。

11

類的初始化

虛擬機(jī)規(guī)范嚴(yán)格規(guī)定了有且僅有5種情況必須立即對類進(jìn)行初始化:

  1. 遇到new,getstatic,putstatic或invokestatic這4條字節(jié)碼指令時,如果類還沒有進(jìn)行初始化哀九,則需要先觸發(fā)其初始化剿配。例如:使用new關(guān)鍵字實(shí)例化對象的時候、讀取或設(shè)置一個類的靜態(tài)屬性的時候阅束、以及調(diào)用一個類的靜態(tài)方法的時候呼胚。
  2. 使用java.lang.reflect包的方法對類進(jìn)行反射調(diào)用的時候,如果類還沒有進(jìn)行初始化息裸,則需要先觸發(fā)其初始化蝇更。
  3. 當(dāng)初始化一個類的時候沪编,如果發(fā)現(xiàn)其父類還沒有進(jìn)行初始化時,則需要先觸發(fā)父類的初始化年扩。
  4. 當(dāng)虛擬機(jī)啟動的時候蚁廓,用戶需要指定一個要執(zhí)行的主類,虛擬機(jī)會先初始化這個類厨幻。
  5. 如果一個java.lang.invoke.MethodHandle實(shí)例最后的解析結(jié)果REF_getStatic,REF_putStatic,REF_invokeStatic的方法句柄相嵌,并且這個方法句柄所對應(yīng)的類沒有進(jìn)行過初始化,則需要先觸發(fā)其初始化况脆。

這5種場景中的行為稱為對一個類進(jìn)行主動引用饭宾,除此之外,所有引用類的方式都不會觸發(fā)初始化格了,稱為被動引用看铆,例如:

  • 通過子類引用父類的靜態(tài)字段,不會導(dǎo)致子類初始化
public class Father {
    static {
        System.out.println("load father");
    }
    public static int value = 1;
}

class Child extends Father{
    static {
        System.out.println("load child");
    }
}
public static void main(String[] args) {
    System.out.println(Child.value);
}

上述代碼不會輸出"load child"盛末;因此通過子類來引用父類中定義的靜態(tài)字段弹惦,不會觸發(fā)子類的初始化。

  • 通過數(shù)組定義來引用類悄但,不會觸發(fā)此類的初始化
public static void main(String[] args) {
    Father[] fathers = new Father[2];
}

上述代碼不會輸出"load father"棠隐;說明沒有觸發(fā)Father類的初始化。

  • 引用常量不會觸發(fā)此類的初始化
public class Constant {
    static {
        System.out.println("load Constant");
    }
    public static final String HELLO = "hello";
}
public class TestDemo {
    public static void main(String[] args) {
        System.out.println(Constant.HELLO);
    }
}

上述代碼不會輸出"load Constant"算墨;這是因?yàn)殡m然在Constant中定義了常量HELLO宵荒,但其實(shí)在編譯階段通過常量傳播優(yōu)化,已經(jīng)將此常量的值"hello"存儲到了TestDemo類的常量池中净嘀,以后TestDemo對常量Constant.HELLO的引用實(shí)際被轉(zhuǎn)化為TestDemo類對自身常量池的引用了。也就是說侠讯,實(shí)際上TestDemo的Class文件之中并沒有Constant類的符號引用入口挖藏,這兩個類在編譯成Class之后就不存在任何聯(lián)系了。

接口的初始化

接口也有初始化過程厢漩,上面類的初始化是通過靜態(tài)代碼塊"static{}"來輸出初始化信息的膜眠,而接口中不能使用"static{}",但編譯器任然會為接口生成"<clinit>()"類構(gòu)造器溜嗜,用于初始化接口中所定義的成員變量宵膨。接口與類真正的區(qū)別是前面5種初始化場景中的第3種:當(dāng)一個類在初始化時,要求其父類全部都已經(jīng)初始化過了炸宵,但是一個接口在初始化時辟躏,并不要求其父類全部都完成了初始化,只有在真正使用到父類接口的時候才會初始化土全。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捎琐,一起剝皮案震驚了整個濱河市会涎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瑞凑,老刑警劉巖末秃,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異籽御,居然都是意外死亡练慕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門技掏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铃将,“玉大人,你說我怎么就攤上這事零截◆锶” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵涧衙,是天一觀的道長哪工。 經(jīng)常有香客問我,道長弧哎,這世上最難降的妖魔是什么雁比? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮撤嫩,結(jié)果婚禮上偎捎,老公的妹妹穿的比我還像新娘。我一直安慰自己序攘,他們只是感情好茴她,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著程奠,像睡著了一般丈牢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞄沙,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天己沛,我揣著相機(jī)與錄音,去河邊找鬼距境。 笑死申尼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垫桂。 我是一名探鬼主播师幕,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伪货!你這毒婦竟也來了们衙?” 一聲冷哼從身側(cè)響起钾怔,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒙挑,沒想到半個月后宗侦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忆蚀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年矾利,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馋袜。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡男旗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欣鳖,到底是詐尸還是另有隱情察皇,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布泽台,位于F島的核電站什荣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怀酷。R本人自食惡果不足惜稻爬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜕依。 院中可真熱鬧桅锄,春花似錦、人聲如沸样眠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檐束。三九已至商佑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厢塘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工肌幽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晚碾,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓喂急,卻偏偏與公主長得像格嘁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子廊移,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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

  • 有興趣可以先參考前面的幾篇JVM總結(jié): JVM自動內(nèi)存管理機(jī)制-Java內(nèi)存區(qū)域(上) JVM自動內(nèi)存管理機(jī)制-J...
    零點(diǎn)145閱讀 239評論 0 0
  • 代碼編譯的結(jié)果從本地機(jī)器碼轉(zhuǎn)變?yōu)樽止?jié)碼糕簿,是存儲格式發(fā)展的一小步探入,確實(shí)編譯語言發(fā)展的一大步。 虛擬機(jī)把描述類的數(shù)據(jù)從...
    胡二囧閱讀 948評論 0 0
  • 虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存懂诗, 并對數(shù)據(jù)進(jìn)行校驗(yàn)蜂嗽、轉(zhuǎn)換解析和初始化, 最終形成可以被虛擬機(jī)直接使...
    好好學(xué)習(xí)Sun閱讀 1,190評論 0 3
  • 一殃恒、類加載的時機(jī) 從類被加載到虛擬機(jī)內(nèi)存中開始植旧,到卸載出內(nèi)存為止,它的整個生命周期分為7個階段离唐,加載(Loadin...
    Jivanmoon閱讀 558評論 0 0
  • 什么是類加載病附? 虛擬機(jī)把類的數(shù)據(jù)從Class文件(二進(jìn)制字節(jié)流)加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗(yàn)亥鬓、轉(zhuǎn)換解析和初始化完沪,最...
    tangyu_tyty閱讀 305評論 0 0