虛擬機類加載總結--深入理解java虛擬機·讀書筆記(二)

虛擬機類加載總結

時間:20180223


一垄懂、學習總結


總結1
知識儲備

什么是靜態(tài)方法?
什么是靜態(tài)類痛垛?
什么是常量池草慧?
什么是靜態(tài)變量?

二匙头、類加載機制流程
1.什么是類加載機制漫谷?
JVM把class文件加載到內(nèi)存里面,并對數(shù)據(jù)進行校驗蹂析、準備舔示、解析和初始化,最總形成可以被JVM直接使用的java類型的過程电抚。

2.類的加載流程圖

類加載流程圖

3.類加載的過程--加載
”加載“是”類加載(Class Loading )“過程的一個階段惕稻,切記不要混淆。
在加載階段蝙叛,虛擬機需要完成以下三個階段俺祠。
1)將class文件記載到內(nèi)存中。(通過類的全限定名來獲取定義此類的二進制字節(jié)流)。
2)將上述字節(jié)流代表的靜態(tài)數(shù)據(jù)結構(數(shù)據(jù)存在于class文件的結構)轉化成方法區(qū)中運行時的數(shù)據(jù)結構(數(shù)據(jù)存在于JVM時的數(shù)據(jù)結構)蜘渣。
3)在內(nèi)存中(堆)生成一個代表這個類的class對象(java.lang.class)淌铐,作為數(shù)據(jù)(方法區(qū))訪問入口。

4.鏈接
鏈接就是將java類的二進制代碼合并到java的運行狀態(tài)中的過程蔫缸。

  • 驗證:確保加載的類符合JVM規(guī)范與安全(確保Class文件的字節(jié)流中包含的信息符合JVM規(guī)范與安全)
  • 準備:為類變量(static變量)分配內(nèi)存(在方法區(qū)中分配空間)腿准,并設置類變量的初始值。注意 -- 這里的類變量僅值被static修飾的變量拾碌,而不包括實例變量释涛;實例變量將會在對象的實例化時隨著對象一起分配在java堆中。例如public static int a = 123; 在此階段a被初始化為0倦沧,其它數(shù)據(jù)類型參考成員變量聲明唇撬。
//TO DO待加入Test代碼
  • 解析:虛擬機將常量池的符號引用轉變成直接引用。例如"aaa"為常量池的一個值展融,直接把"aaa"替換成存在于內(nèi)存中的地址窖认。

符號引用:符號引用以一組符號(全限定名)來描述所引用的目標,符號可以是任何形式的字面量告希,只要使用時能無歧義地定位到目標既可以扑浸。符號引用與虛擬機實現(xiàn)的內(nèi)存布局無關,引用的目標并不一定已經(jīng)加載到內(nèi)存中燕偶。

直接引用:直接引用可以使直接指向目標的指針喝噪、相對偏移量或是一個能間接定位到目標的句柄。直接應用是與虛擬機實現(xiàn)的內(nèi)存布局相關指么。如果有了直接引用酝惧,那么引用的目標必定已經(jīng)在內(nèi)存中存在。

  • 初始化:初始化是類加載過程的最后一步伯诬。初始化階段是執(zhí)行類構造器<clinit>()方法的過程晚唇。

在了加載過程中,除了在加載階段用戶應用程序可以通過自定義類加載器參與外盗似,其余動作完全由虛擬機主導和控制哩陕。到了初始化階段,才真正開始執(zhí)行類中自定義的java程序代碼(或者說是字節(jié)碼)赫舒。
<clinit>()方法是由編譯器自動搜集類中的所有類變量的賦值動作(準備階段的 static a 正式被賦值為a)和靜態(tài)變量與靜態(tài)語句塊static{}合并產(chǎn)生的悍及。
注意 編譯器手機的順序是由語句在源文件中出現(xiàn)的順序決定的,靜態(tài)語句塊只能訪問到定義在靜態(tài)語句塊之前的變量接癌;定義在之后的變量心赶,在前面的靜態(tài)語句塊可以賦值,但是不能訪問扔涧。

例如下列情況园担,會報錯届谈,但報錯的地方不是賦值語句,而是訪問語句弯汰。

訪問靜態(tài)語句塊之后定義的變量

三艰山、類加載與初始化時機
1.類加載時機
當應用程序啟動時候,所有的類會被一次性加載么咏闪?當然不能曙搬,因為一次性加載所有的類,內(nèi)存資源有限鸽嫂,可能會影響應用程序的正常運行纵装。那類什么時候才會被加載呢?例如在 A a = new A()据某,一個類真正被加載的時機是在創(chuàng)建對象的時候橡娄,才會去執(zhí)行以上過程,加載類癣籽。當我們測試的時候挽唉,最新加載擁有main方法的主線程所在的類。
2.類初始化時機
主動引用(發(fā)生類初始化過程)
1.new 一個對象(使用new關鍵字實例化對象)
2.調用類的靜態(tài)成員(除了final常量)和靜態(tài)方法筷狼。
3.通過反射對類進行調用
4.虛擬機啟動瓶籽,main方法所在類被提前初始化。
5.初始化一個類埂材,如果父類沒有初始化塑顺,則先初始化父類。

被動引用(不會發(fā)生類的初始化)
1.當訪問一個靜態(tài)變量時俏险,只有真正生命這個變量的類才會初始化严拒。(例如:子類調用父類的靜態(tài)變量,只有父類初始化寡喝,子類不初始化)糙俗。
2.通過數(shù)組定義類的引用勒奇。不會觸發(fā)此類的初始化预鬓。
3.final變量不會觸發(fā)此類的初始化,因為在編譯階段就存儲在常量池中赊颠。

四格二、圖解分析類加載

package com.amp;

public class ClassLoaderProduce {
    static int d = 3;
    static {
        System.out.println("我是ClassLoaderProduce類");
    }
    public static void main(String [] args) {
        int b = 0;
        String c = "hello";
        SimpleClass simpleClass = new SimpleClass();
        simpleClass.run();
    }
}
package com.amp;

public class SimpleClass {
    static int a = 3;
    static {
        a = 100;
        System.out.println(a);
    }
    public SimpleClass() {
        System.out.println("對類進行加載!");
    }
    public void run() {
        System.out.println("我要泡泡竣蹦!");
    }
}

步驟一:裝載ClassLoaderProduce類顶猜,在方法區(qū)生成動態(tài)數(shù)據(jù)結構(靜態(tài)變量、靜態(tài)方法痘括、常量池长窄、類代碼)滔吠,并且在堆中生成java.lang.class對象;讓后鏈接

步驟二:初始化--把static{}與靜態(tài)變量合并放在類構造器<clinit>()當中挠日,對靜態(tài)變量賦值疮绷。1-5執(zhí)行完畢。

步驟三:執(zhí)行main方法嚣潜,首先在棧里面生成一個main方法的棧幀冬骚,定義變量b、c懂算,注意此處的變量b只冻、c存儲的常量池存儲的變量的地址,如圖所示计技。

步驟四:創(chuàng)建SimpleClass對象喜德;與上面的步驟一類型:加載-鏈接-初始化。然后垮媒,調用run()方法的時候住诸,它會通過classLoader局部變量的地址尋找到類的class對象并且調用run()方法。

image.png

什么是常量池涣澡?

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贱呐,一起剝皮案震驚了整個濱河市入桂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馁蒂,老刑警劉巖沫屡,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異勺届,居然都是意外死亡免姿,警方通過查閱死者的電腦和手機胚膊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門紊婉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刚陡,“玉大人筐乳,你說我怎么就攤上這事蝙云〔伲” “怎么了身隐?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我叁巨,道長锋勺,這世上最難降的妖魔是什么宙刘? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任衙猪,我火速辦了婚禮,結果婚禮上撑瞧,老公的妹妹穿的比我還像新娘。我一直安慰自己曼尊,他們只是感情好瞒御,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布肴裙。 她就那樣靜靜地躺著,像睡著了一般阻肩。 火紅的嫁衣襯著肌膚如雪运授。 梳的紋絲不亂的頭發(fā)上吁朦,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音擂仍,去河邊找鬼。 笑死肃廓,一個胖子當著我的面吹牛盲赊,可吹牛的內(nèi)容都是我干的诚卸。 我是一名探鬼主播合溺,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼将硝,長吁一口氣:“原來是場噩夢啊……” “哼依疼!你這毒婦竟也來了膀值?” 一聲冷哼從身側響起沧踏,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤砰苍,失蹤者是張志新(化名)和其女友劉穎赚导,沒想到半個月后凰锡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厂置,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡智绸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了访忿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞧栗。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖海铆,靈堂內(nèi)的尸體忽然破棺而出迹恐,到底是詐尸還是另有隱情,我是刑警寧澤卧斟,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布殴边,位于F島的核電站,受9級特大地震影響珍语,放射性物質發(fā)生泄漏锤岸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一板乙、第九天 我趴在偏房一處隱蔽的房頂上張望是偷。 院中可真熱鬧,春花似錦募逞、人聲如沸蛋铆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刺啦。三九已至,卻和暖如春透乾,著一層夾襖步出監(jiān)牢的瞬間洪燥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工乳乌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捧韵,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓汉操,卻偏偏與公主長得像再来,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

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

  • 一芒篷、運行時數(shù)據(jù)區(qū)域 Java虛擬機管理的內(nèi)存包括幾個運行時數(shù)據(jù)內(nèi)存:方法區(qū)搜变、虛擬機棧、本地方法棧针炉、堆挠他、程序計數(shù)器,...
    加油小杜閱讀 1,512評論 1 15
  • 《深入理解Java虛擬機》筆記_第一遍 先取看完這本書(JVM)后必須掌握的部分篡帕。 第一部分 走近 Java 從傳...
    xiaogmail閱讀 5,067評論 1 34
  • 注:此文是我在讀完周志明老師的深入理解Java虛擬機之后總結的一篇文章殖侵,請閱讀此書獲取更加詳細的信息. 類加載的時...
    AlstonWilliams閱讀 486評論 0 0
  • 魏城《困局》 火車困在軌道 其實離車站 只有咫尺之遙 無法前行 無法回倒 我們是一列慢車 沒有屬于我們的站臺 只能...
    魏城閱讀 205評論 0 1
  • 大學畢業(yè)后,我到一家國企上班镰烧,至今近九年拢军,一路下來,一言難盡怔鳖! 記得剛工作時茉唉,看到一些年紀稍長的大姐,每天不干活结执,...
    平安歡喜閱讀 500評論 0 0