《深入理解jvm》讀書筆記之——類加載機制(類的初始化)

類加載的生命周期:

加載 -> 驗證 -> 準備 -> 解析 -> 初始化 -> 使用 -> 卸載

加載 -> 驗證 -> 準備 -> 初始化 -> 卸載 這5個階段順序是確定的,klass的加載過程一定會按照這個順序執(zhí)行。為了支持java的運行時綁定,解析階段在某些情況下會在初始化之后才進行吃挑。

類的初始化階段

對于加載這個階段是跟具體的虛擬機實現(xiàn)有關(guān),對于整個類加載階段最重要的就是初始化這個階段.

JVM執(zhí)行初始化的情況

對于Hotspot虛擬機而言,遇見以下這5種情況就需要進行初始化:

  • 遇到new街立、getstatic、putstatic逛犹、invokestatic梁剔,如果類還沒進行初始化的時候就進行初始化。生成這4種指令最常見的就是:new一個實例化對象荣病、讀取或設(shè)置一個類的靜態(tài)字段(被final修飾、已在編譯時吧結(jié)果放在常量池的靜態(tài)字段排除)脖岛,已經(jīng)調(diào)用一個類的靜態(tài)方法時颊亮。
  • 使用java的反射對類進行反射調(diào)用。
  • 初始化類之間绍在,檢測父類是否初始化狠鸳,否則先初始化父類。
  • 虛擬機啟動時卸察,用戶需要制定一個要執(zhí)行的主類(包含main方法的類),虛擬機會先初始化這個類
  • 使用jdk7以上動態(tài)語言支持時铅祸,如果一個methodHandle實例最后的解析結(jié)果REF_getstatic合武、REF_putstatic涡扼、REF_invokestatic的方法句柄,并且這個方法的句柄對應(yīng)的類沒有初始化的時候。

這里我們需要注意的點汤善,上面的五種情況指的是主動的引用方式,除了上面5種主動引用之外的被動引用是不會觸發(fā)初始化的.

類的被動引用實例:

情況一:通過子類來引用父類的靜態(tài)字段,是只會執(zhí)行父類的初始化而子類不會初始化的,但是Hotspot虛擬機下會觸發(fā)子類的加載和驗證票彪。

情況二:聲明一個數(shù)組類型的類。因為jvm會調(diào)用newarray生成一個繼承自object的子類在旱,這個類代表了對應(yīng)的這個類型的數(shù)組類型推掸。

情況三:A引用了B中fianl修飾過的靜態(tài)屬性不會導(dǎo)致B的初始化,因為經(jīng)過編譯器的優(yōu)化,A中引用的這個B的屬性元素已經(jīng)在編譯時期存儲到了A類下的常量池中,所以其實A下的引用來自于對自身常量池的引用登渣。

我們這里還需要注意的一點是接口和類不同的就是接口的父接口只有在真正被使用的時候才會被初始化铃彰。

類的初始化之clinit方法

對于jvm而言芯咧,類的初始化也就是執(zhí)行clinit方法,那么什么是clinit方法?

clinit方法是有編譯器自動收集類中的所有變量的賦值動作和靜態(tài)語句塊中的語句合并產(chǎn)生的一個用于jvm執(zhí)行類的初始化的方法邪铲。

需要注意以下幾點:

  • clinit方法不需要顯示的調(diào)用父類構(gòu)造器,虛擬機會保證子類的clinit方法執(zhí)行之前父類的clinit方法已經(jīng)調(diào)用完畢,因此虛擬機中第一個被執(zhí)行clinit方法的肯定是Object无拗。
  • clinitt對于類和接口不是必須的,如果類中沒有靜態(tài)塊揽惹,也沒有對變量的賦值操作四康,編譯器可以不為這個類生產(chǎn)clinit方法。
  • 執(zhí)行接口的clinit方法不需要先執(zhí)行父接口的clinit方法疯溺,只有當(dāng)父接口中定義的變量被使用,父接口才會初始化囱嫩。另外接口的實現(xiàn)類在初始化也一樣不會執(zhí)行接口的clinit方法墨闲。
  • jvm會保證一個類的clinit方法在多線程環(huán)境下被正確加鎖同步,也就是說類的初始化是線程安全的鸳碧,同時需要注意的是,如果一個線程執(zhí)行clinit方法時有很耗時的操作雁仲,就會阻塞其他也要初始化的這個類的線程琐脏。

驗證猜想的小技巧

關(guān)于我們文章上述初始化過程中,如何驗證吹艇,我們可以吧代碼在寫在類的static塊里昂拂,就能驗證我買的猜想了。原理就在上文關(guān)于clinit方法中格侯。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末联四,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子醉拓,更是在濱河造成了極大的恐慌收苏,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件排吴,死亡現(xiàn)場離奇詭異杜跷,居然都是意外死亡矫夷,警方通過查閱死者的電腦和手機憋槐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門阳仔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忧陪,“玉大人,你說我怎么就攤上這事近范∷惶” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵评矩,是天一觀的道長叶堆。 經(jīng)常有香客問我,道長斥杜,這世上最難降的妖魔是什么虱颗? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮蔗喂,結(jié)果婚禮上忘渔,老公的妹妹穿的比我還像新娘缰儿。我一直安慰自己畦粮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布乖阵。 她就那樣靜靜地躺著宣赔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪义起。 梳的紋絲不亂的頭發(fā)上拉背,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天师崎,我揣著相機與錄音默终,去河邊找鬼。 笑死犁罩,一個胖子當(dāng)著我的面吹牛齐蔽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播床估,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼含滴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丐巫?” 一聲冷哼從身側(cè)響起谈况,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤勺美,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碑韵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赡茸,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年祝闻,在試婚紗的時候發(fā)現(xiàn)自己被綠了占卧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡联喘,死狀恐怖华蜒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豁遭,我是刑警寧澤叭喜,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站蓖谢,受9級特大地震影響域滥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜈抓,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一启绰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沟使,春花似錦委可、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至燕少,卻和暖如春卡者,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背客们。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工崇决, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人底挫。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓恒傻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親建邓。 傳聞我的和親對象是個殘疾皇子盈厘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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