類加載過程

類的加載過程

加載

  • 通過一個類的全限定名獲取此類的二進制字節(jié)流
  • 將這個字節(jié)流所代表的靜態(tài)存儲結構轉化為方法區(qū)的運行時數(shù)據(jù)據(jù)結構
  • 在內(nèi)存中生成一個代表這個類的java.lang.Class對象般哼,作為方法區(qū)這個類的各種數(shù)據(jù)訪問入口
加載.class文件的方式
  • 從本地系統(tǒng)中直接加載
  • 通過網(wǎng)絡獲取
  • 從zip壓縮包中讀取,成為日后jar,war格式的基礎
  • 運行時計算生成铃在,使用最多的是:動態(tài)代理
  • 有其他文件生成(JSP)
  • 從數(shù)據(jù)庫中提取
  • 從加密文件中獲饶粘(防止反編譯)

鏈接

驗證
  • 目的在于確保Class文件的字節(jié)流中包含信息符合當前虛擬機要求,保證被加載類的正確性,不會危害虛擬機自身安全
  • 主要包括四種驗證:文件格式驗證唁盏,元數(shù)據(jù)驗證蚕苇,字節(jié)流驗證旗芬,符號引用驗證
準備
  • 為類變量分配內(nèi)存并且設置該類變量的默認初始值,即零值
  • 這里不包含用final修飾的static捆蜀,因為final在編譯的時候就會分配了疮丛,準備階段會顯式初始化
  • 這里不會為實例變量分配初始化,類變量會分配在方法區(qū)辆它,而實例變量是會隨著對象一起分配到Java堆中去
解析
  • 將常量池內(nèi)的符號引用轉換為直接引用的過程
  • 事實上誊薄,解析操作往往會伴隨著JVM在執(zhí)行完初始化之后再執(zhí)行
  • 解析動作主要針對類或接口,字段锰茉,類方法呢蔫,接口方法,方法類型等飒筑。對應常量池中的CONSTANT_Class_info等

初始化

  • 初始化階段就是執(zhí)行類構造器方法<clinit>()的過程
  • 此方法不需定義片吊,就是javac編譯器自動收集類中的所有類變量的賦值動作和靜態(tài)代碼塊中的語句合并而來
  • 構造器方法中指令按語句在源文件中出現(xiàn)的順序執(zhí)行。
public class ClassInitTest {
    private static int num = 1;

    static {
        num = 2;
        number = 20;
        System.out.println(number);// 會報錯:非法的前向引用
    }

    private static int number = 10; // 鏈接的準備階段:number=0 -->初始化<clinit>()按順序依次:20 -->10

    public static void main(String[] args) {
        System.out.println(ClassInitTest.num);// 2
        System.out.println(ClassInitTest.number); // 0
    }
}
  • <clinit>()不同于類的構造器(構造器是虛擬機反編譯后的<init>()方法),當沒有靜態(tài)變量時或靜態(tài)代碼塊协屡,就不會存在
  • 若該類具有父類俏脊,JVM會保證父類的<clinit>()執(zhí)行完成后,再執(zhí)行子類的<clinit>()
public class ClassInitTest {
    static class Father {
        public static int A = 1;

        static {
            A = 2;
        }
    }

    static class Son extends Father {
        public static int B = A
    }

    public static void main(String[] args) {
        System.out.println(Son.B);// 2
    }
}
  • 虛擬機必須保證一個類的<clinit>()方法在多線程下被同步執(zhí)行
public class ClassInitTest {
    public static void main(String[] args) {
        Runnable r = () -> {
            System.out.println(Thread.currentThread().getName() + "開始");
            DeadThread deadThread = new DeadThread();
            System.out.println(Thread.currentThread().getName() + "結束");
        };
        Thread t1 = new Thread(r, "線程1");
        Thread t2 = new Thread(r, "線程2");
        t1.start();
        t2.start();
    }

    class DeadThread {
        static {
            if (true) {
                System.out.println(Thread.currentThread().getName() + "初始化DeadThread");
                while (true) {

                }
            }

        }
    }
}

結果是只能輸出一次 ‘初始化DeadThread’肤晓,如果初始化阻塞爷贫,會影響其他類無法使用該類

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市补憾,隨后出現(xiàn)的幾起案子漫萄,更是在濱河造成了極大的恐慌,老刑警劉巖盈匾,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腾务,死亡現(xiàn)場離奇詭異,居然都是意外死亡削饵,警方通過查閱死者的電腦和手機岩瘦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來葵孤,“玉大人担钮,你說我怎么就攤上這事∮热裕” “怎么了箫津?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我苏遥,道長饼拍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任田炭,我火速辦了婚禮师抄,結果婚禮上,老公的妹妹穿的比我還像新娘教硫。我一直安慰自己叨吮,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布瞬矩。 她就那樣靜靜地躺著茶鉴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪景用。 梳的紋絲不亂的頭發(fā)上涵叮,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音伞插,去河邊找鬼割粮。 笑死,一個胖子當著我的面吹牛媚污,可吹牛的內(nèi)容都是我干的舀瓢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼杠步,長吁一口氣:“原來是場噩夢啊……” “哼氢伟!你這毒婦竟也來了?” 一聲冷哼從身側響起幽歼,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谬盐,沒想到半個月后甸私,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡飞傀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年皇型,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砸烦。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡弃鸦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幢痘,到底是詐尸還是另有隱情唬格,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站购岗,受9級特大地震影響汰聋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喊积,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一烹困、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乾吻,春花似錦髓梅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辜御,卻和暖如春鸭你,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擒权。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工袱巨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碳抄。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓愉老,卻偏偏與公主長得像,于是被迫代替她去往敵國和親剖效。 傳聞我的和親對象是個殘疾皇子嫉入,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359