《深入理解Java虛擬機》讀書筆記之——類加載的過程

1.1 加載

加載的過程中,jvm要完成以下三件事:

  • 通過一個類的全限定名來獲取定義此類的二進制字節(jié)流穿肄。
  • 將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu)年局。
  • 在內(nèi)存中生成一個代表這個類的java.lang.Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口咸产。

注意:對于第一條,jvm并沒有特殊地去指定這個類應(yīng)該從哪里獲取,基于這一條,現(xiàn)在的java平臺發(fā)展出了jar,war等;以及動態(tài)的運行時計算生成,也就是我們現(xiàn)在著名的動態(tài)代理技術(shù);另外也諸如由其他的文件生成,例如jsp矢否。

非數(shù)組類的加載階段:類的加載階段可以使用系統(tǒng)的類加載器,也可以自定義類加載器(重寫一個類加載器的loadClass()方法)。

數(shù)組類的加載階段:數(shù)組類本身不通過類加載器創(chuàng)建脑溢,它是由Java虛擬機直接創(chuàng)建的僵朗。一個數(shù)組類創(chuàng)建過程遵循以下規(guī)則:

  • 如果數(shù)組的組件類型是引用類型,就遞歸采用上面的加載過程去加載這個組件類型屑彻,數(shù)組將在加載該組件類型的類加載器的類名稱空間上被標識验庙。
  • 如果數(shù)組的組件類型不是引用類型(例如int[]數(shù)組),Java虛擬機將會把數(shù)組標記為與引導(dǎo)類加載器關(guān)聯(lián)酱酬。
  • 數(shù)組類的可見性與它的組件類型的可見性一致壶谒,如果組件類型不是引用類型,那數(shù)組類的可見性將默認為public膳沽。

加載的階段完成后汗菜,jvm外部的二進制字節(jié)流按虛擬機所需要的格式存在方法區(qū)里让禀,方法區(qū)中的數(shù)據(jù)存儲格式由jvm自行定義。然后在內(nèi)存中實例化一個java.lang.Class類的對象(沒有明確規(guī)定是在java堆里,對于Hotspot來說陨界,Class對象比較特殊,雖然是對象巡揍,卻會放在方法區(qū)里)。

1.2 驗證

驗證是連接階段的第一步菌瘪,這一階段的目的是為了確保Class文件的字節(jié)流中包含的信息符合當前虛擬機的要求腮敌,并且不會危害虛擬機自身的安全。

驗證階段大致上會完成下面4個階段的檢驗動作:

  • 文件格式驗證:驗證字節(jié)流是否符合Class文件格式的規(guī)范俏扩,并且能被當前版本的虛擬機處理糜工。這階段的驗證是基于二進制字節(jié)流進行的,只有通過了這個階段的驗證后录淡,字節(jié)流才會進入內(nèi)存的方法區(qū)中進行存儲捌木,所以后面的3個驗證階段全部是基于方法區(qū)的存儲結(jié)構(gòu)進行的,不會再直接操作字節(jié)流嫉戚。
  • 元數(shù)據(jù)驗證:對字節(jié)碼描述的信息進行語義分析刨裆,以保證其描述的信息符合Java語言規(guī)范的要求。(這個類是否有父類彬檀,父類是否繼承了不允許被繼承的final類等)帆啃。
  • 字節(jié)碼驗證:通過數(shù)據(jù)流和控制流分析,確定程序語義是合法的窍帝、符合邏輯的努潘。保證被校驗類的方法體在運行時不會做出危害虛擬機安全的事件。
  • 符號引用驗證:對類自身以外(常量池中的各種符號引用)的信息進行匹配性校驗坤学。

1.3 準備

準備階段是正式為類變量分配內(nèi)存并設(shè)置類變量初始值的階段慈俯,這些變量所使用的內(nèi)存都將在方法區(qū)中進行分配。注意:這時候進行內(nèi)存分配的僅包括類變量(被static修飾的變量)拥峦,而不包括實例變量,實例變量將會在對象實例化時隨著對象一起分配在Java堆中卖子。

我們這里舉個例子public static int a = 123;,這里的變量a就是類變量略号。并且這里我們需要注意一個事情,對于準備階段而已洋闽,變量a的值是0玄柠,而復(fù)制變量a為123的操作是在初始化階段的clinit方法中執(zhí)行的。

但是對于上面的情況诫舅,如果把變量a用final修飾,public static final int a = 123;羽利,那么在編譯時javac會為變量a生成ConstantValue屬性,在準備階段Jvm就會根據(jù)ConstantValue的設(shè)置為變量a賦值刊懈。

1.4 解析

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

符號引用:以一組符號來描述所引用的目標娃闲,符號可以是類和形式的字面量,只要使用時能無歧義的定位到目標即可匾浪,與虛擬機實現(xiàn)的內(nèi)存布局無關(guān)皇帮,引用的目標不一定已經(jīng)加載到內(nèi)存中。

直接引用:可以是直接指向目標的指針蛋辈、相對偏移量或者是一個能間接定位到目標的句柄属拾。直接引用是和虛擬機實現(xiàn)的內(nèi)存布局相關(guān)的,引用的目標必定已經(jīng)在內(nèi)存中存在冷溶。

除了invokeDynamic指令以外渐白,虛擬機實現(xiàn)可以對第一次解析的結(jié)果進行緩存(在運行時常量池中記錄直接引用,并把常量標示為已解狀態(tài))從而避免解析動作重復(fù)進行逞频。無論是否真正被執(zhí)行了多少次解析纯衍,jvm需要保證的是在同一個實體中,如果一個符號引用之前已經(jīng)被成功解析過虏劲,那后續(xù)的引用解析請求就應(yīng)該一直成功托酸;同理,第一次解析失敗了柒巫,那么其他指令對這個符號的解析請求也就應(yīng)該收到相同的異常励堡。
對應(yīng)上面的規(guī)則,invokeDynamic指令是例外的堡掏,invokeDynamic指令只有在程序?qū)嶋H運行到這條指令解析動作才開始進行应结。

而java的解析階段主要是針對于4塊:類或者接口的解析、字段解析泉唁、類方法解析鹅龄,接口方法解析

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市亭畜,隨后出現(xiàn)的幾起案子扮休,更是在濱河造成了極大的恐慌,老刑警劉巖拴鸵,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玷坠,死亡現(xiàn)場離奇詭異,居然都是意外死亡劲藐,警方通過查閱死者的電腦和手機八堡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聘芜,“玉大人兄渺,你說我怎么就攤上這事√郑” “怎么了挂谍?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵叔壤,是天一觀的道長。 經(jīng)常有香客問我凳兵,道長百新,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任庐扫,我火速辦了婚禮饭望,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘形庭。我一直安慰自己铅辞,他們只是感情好,可當我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布萨醒。 她就那樣靜靜地躺著斟珊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪富纸。 梳的紋絲不亂的頭發(fā)上囤踩,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天,我揣著相機與錄音晓褪,去河邊找鬼堵漱。 笑死,一個胖子當著我的面吹牛涣仿,可吹牛的內(nèi)容都是我干的勤庐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼好港,長吁一口氣:“原來是場噩夢啊……” “哼愉镰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钧汹,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丈探,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拔莱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體类嗤,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年辨宠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片货裹。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗤形,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弧圆,到底是詐尸還是另有隱情赋兵,我是刑警寧澤笔咽,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站霹期,受9級特大地震影響叶组,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜历造,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一甩十、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吭产,春花似錦侣监、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至邑蒋,卻和暖如春姓蜂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背医吊。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工钱慢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遮咖。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓滩字,卻偏偏與公主長得像,于是被迫代替她去往敵國和親御吞。 傳聞我的和親對象是個殘疾皇子麦箍,可洞房花燭夜當晚...
    茶點故事閱讀 45,442評論 2 359

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