阿里架構(gòu)師帶你“優(yōu)雅”解讀JVM 架構(gòu)

前言:每個(gè)Java開發(fā)人員都知道字節(jié)碼由JRE(Java運(yùn)行時(shí)環(huán)境)執(zhí)行。但許多人不知道JRE是Java Virtual Machine(JVM)的實(shí)現(xiàn),它分析字節(jié)碼,解釋代碼并執(zhí)行它税灌。作為開發(fā)人員吹害,我們應(yīng)該知道JVM的架構(gòu)是非常重要的螟凭,因?yàn)樗刮覀兡軌蚋行У鼐帉懘a。在本文中它呀,我們將更深入地了解Java中的JVM架構(gòu)和JVM的不同組件螺男。

什么是JVM?

Virtual Machine是物理機(jī)器的軟件實(shí)現(xiàn)纵穿。Java是用在VM上運(yùn)行的WORA(Write Once Run Anywhere)概念而開發(fā)的下隧。編譯器將Java文件編譯為Java .class文件,然后將.class文件輸入到JVM中谓媒,JVM會加載并執(zhí)行類文件淆院。下面是JVM的架構(gòu)圖。

JVM如何工作句惯?

如上面的架構(gòu)圖所示土辩,JVM分為三個(gè)主要子系統(tǒng):

類加載器子系統(tǒng)

運(yùn)行時(shí)數(shù)據(jù)區(qū)

執(zhí)行引擎

1.類加載器子系統(tǒng)

Java的動態(tài)類加載功能由類加載器子系統(tǒng)處理。它在運(yùn)行時(shí)抢野,而不是編譯時(shí)首次引用類的時(shí)候加載拷淘、鏈接、并初始化類文件指孤。

1.1加載

類將通過此組件加載启涯。Boot Strap Class Loader,Extension Class Loader和Application Class Loader是有助于實(shí)現(xiàn)的三個(gè)類加載器恃轩。

1.Boot Strap Class Loader——負(fù)責(zé)加載來自于Bootstrap類路徑的類结洼,就是rt.jar。此加載程序?qū)⒔o予最高優(yōu)先級详恼。

2.Extension Class Loader——負(fù)責(zé)加載在ext文件夾(jre lib)內(nèi)的類补君。

3.Application Class Loader——負(fù)責(zé)加載應(yīng)用程序級類路徑,路徑提到環(huán)境變量等

上面的類記載器在加載類文件時(shí)遵循Delegation Hierarchy 算法昧互。

1.2鏈接

1.驗(yàn)證——字節(jié)碼驗(yàn)證器將驗(yàn)證生成的字節(jié)碼是否正確挽铁,如果驗(yàn)證失敗伟桅,我們將得到verification error。

2.準(zhǔn)備——對于所有的靜態(tài)變量叽掘,內(nèi)存將被分配和配置默認(rèn)值楣铁。

3.解決——所有的符號存儲器引用都將替換為來自Method Area的原始引用。

1.3初始化

這是類加載的最后階段更扁,這里所有的靜態(tài)變量都將被賦予原始值盖腕,并執(zhí)行靜態(tài)塊。

2.運(yùn)行時(shí)數(shù)據(jù)區(qū)

運(yùn)行時(shí)數(shù)據(jù)區(qū)分為5個(gè)主要組件:

方法區(qū)——所有的類級別數(shù)據(jù)將存儲在這里浓镜,包括靜態(tài)變量溃列。每個(gè)JVM只有一個(gè)方法區(qū),并且它是一個(gè)共享資源膛薛。

堆區(qū)域——所有對象及其對應(yīng)的實(shí)例變量和數(shù)組將存儲在這里听隐。每個(gè)JVM也有一個(gè)堆區(qū)域。由于方法和堆區(qū)域共享多個(gè)線程的內(nèi)存哄啄,因此所存儲的數(shù)據(jù)非線程安全雅任。

堆棧區(qū)——對于每個(gè)線程,將創(chuàng)建一個(gè)單獨(dú)的運(yùn)行時(shí)棧咨跌。對于每個(gè)方法調(diào)用沪么,將在堆棧存儲器中產(chǎn)生一個(gè)條目,稱為堆棧幀锌半。所有局部變量將在堆棧內(nèi)存中創(chuàng)建禽车。堆棧區(qū)域是線程安全的,因?yàn)樗皇枪蚕碣Y源刊殉。堆棧幀分為三個(gè)子元素:

1.局部變量數(shù)組——與方法相關(guān)哭当,涉及局部變量以及將在此存儲的相應(yīng)值的多少。

2.操作數(shù)堆椚叱海——如果需要執(zhí)行任何中間操作,那么操作數(shù)堆棧將充當(dāng)運(yùn)行時(shí)工作空間來執(zhí)行操作陋葡。

3.幀數(shù)據(jù)——對應(yīng)于方法的所有符號存儲在此處亚亲。在任何異常的情況下,捕捉塊信息將被保持在幀數(shù)據(jù)中腐缤。

PC寄存器——每個(gè)線程都有單獨(dú)的PC寄存器捌归,用于保存當(dāng)前執(zhí)行指令的地址,一旦指令執(zhí)行岭粤,PC寄存器將更新到下一條指令惜索。

本地方法堆棧——本地方法堆棧保存本地方法信息。對于每個(gè)線程剃浇,將創(chuàng)建一個(gè)單獨(dú)的本地方法堆棧巾兆。

3.執(zhí)行引擎

分配給運(yùn)行時(shí)數(shù)據(jù)區(qū)的字節(jié)碼將由執(zhí)行引擎執(zhí)行猎物。執(zhí)行引擎讀取字節(jié)碼并逐個(gè)執(zhí)行它。

解釋器——解釋器解釋字節(jié)碼較快角塑,但執(zhí)行慢蔫磨。解釋器的缺點(diǎn)是當(dāng)一個(gè)方法被多次調(diào)用時(shí),每次都需要新的解析圃伶。

JIT編譯器——JIT編譯器消除了解釋器的缺點(diǎn)堤如。執(zhí)行引擎將在轉(zhuǎn)換字節(jié)碼時(shí)使用解釋器的幫助,但是當(dāng)它發(fā)現(xiàn)重復(fù)的代碼時(shí)窒朋,它使用JIT編譯器搀罢,編譯器會編譯整個(gè)字節(jié)碼并將其更改為本地代碼。這個(gè)本地代碼將直接用于重復(fù)的方法調(diào)用侥猩,從而提高系統(tǒng)性能榔至。

1.中間代碼生成器——生成中間代碼

2.代碼優(yōu)化器——負(fù)責(zé)優(yōu)化上面生成的中間代碼

3.目標(biāo)代碼生成器——負(fù)責(zé)生成機(jī)器代碼或本地代碼

4.分析器——一個(gè)特殊組件,負(fù)責(zé)查找熱點(diǎn)拭宁,即該方法是否被多次調(diào)用洛退。

垃圾收集器:收集和刪除未引用的對象〗鼙辏可以通過調(diào)用“System.gc()”觸發(fā)垃圾收集器兵怯,但不能保證執(zhí)行。JVM的垃圾回收收集創(chuàng)建的對象腔剂。

Java本機(jī)接口(JNI):JNI將與本地方法庫進(jìn)行交互媒区,并提供執(zhí)行引擎所需的本地庫。

本地方法庫:它是執(zhí)行引擎所需的本地庫的集合掸犬。

針對上面的技術(shù)我特意整理了一下袜漩,有很多技術(shù)不是靠幾句話能講清楚,所以干脆找朋友錄制了一些視頻湾碎,很多問題其實(shí)答案很簡單宙攻,但是背后的思考和邏輯不簡單,要做到知其然還要知其所以然介褥。如果想學(xué)習(xí)Java工程化座掘、高性能及分布式、深入淺出柔滔。微服務(wù)溢陪、Spring,MyBatis睛廊,Netty源碼分析的朋友可以加我的Java進(jìn)階群:694549689形真,群里有阿里大牛直播講解技術(shù),以及Java大型互聯(lián)網(wǎng)技術(shù)的視頻免費(fèi)分享給大家超全。

1.具有1-5工作經(jīng)驗(yàn)的咆霜,面對目前流行的技術(shù)不知從何下手邓馒,需要突破技術(shù)瓶頸的可以加群。

2.在公司待久了裕便,過得很安逸绒净,但跳槽時(shí)面試碰壁。需要在短時(shí)間內(nèi)進(jìn)修偿衰、跳槽拿高薪的可以加群挂疆。

3.如果沒有工作經(jīng)驗(yàn),但基礎(chǔ)非常扎實(shí)下翎,對java工作機(jī)制缤言,常用設(shè)計(jì)思想,常用java開發(fā)框架掌握熟練的可以加群视事。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胆萧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俐东,更是在濱河造成了極大的恐慌跌穗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虏辫,死亡現(xiàn)場離奇詭異蚌吸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砌庄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門羹唠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娄昆,你說我怎么就攤上這事佩微。” “怎么了萌焰?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵哺眯,是天一觀的道長。 經(jīng)常有香客問我扒俯,道長族购,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任陵珍,我火速辦了婚禮,結(jié)果婚禮上违施,老公的妹妹穿的比我還像新娘互纯。我一直安慰自己,他們只是感情好磕蒲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布留潦。 她就那樣靜靜地躺著只盹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兔院。 梳的紋絲不亂的頭發(fā)上殖卑,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音坊萝,去河邊找鬼孵稽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛十偶,可吹牛的內(nèi)容都是我干的菩鲜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惦积,長吁一口氣:“原來是場噩夢啊……” “哼接校!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狮崩,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛛勉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后睦柴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诽凌,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年爱只,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皿淋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恬试,死狀恐怖窝趣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情训柴,我是刑警寧澤哑舒,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站幻馁,受9級特大地震影響洗鸵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仗嗦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一膘滨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稀拐,春花似錦火邓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躲胳。三九已至,卻和暖如春纤勒,著一層夾襖步出監(jiān)牢的瞬間坯苹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工摇天, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粹湃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓闸翅,卻偏偏與公主長得像再芋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子坚冀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理济赎,服務(wù)發(fā)現(xiàn),斷路器记某,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 五司训、Java 虛擬機(jī) 一、什么是Java虛擬機(jī)Java虛擬機(jī)是一個(gè)想象中的機(jī)器,在實(shí)際的計(jì)算機(jī)上通過軟件模擬來實(shí)現(xiàn)...
    壹點(diǎn)零閱讀 738評論 0 0
  • 從小長到大液南,我沒去什么地方玩過壳猜,目前為止,只去過深圳滑凉,廣州统扳,江西,四川畅姊。 我是高二的暑假去江西的咒钟,去那里兼職暑假工...
    誰的孤獨(dú)是一顆眼淚閱讀 380評論 0 0
  • 我們在開發(fā)中,很多地方可能都會 imageView 的身影,尤其是應(yīng)用管理類的 app,包括一些社交類的用戶頭像....
    devZhang閱讀 2,730評論 14 46
  • 作為一個(gè)現(xiàn)代人,保持獨(dú)立思考力有多重要若未? 在任何時(shí)候能有自己的觀點(diǎn)朱嘴、有自己清晰的思考力,我認(rèn)為這不僅是件難得的事情...
    大童小逸閱讀 484評論 0 2