JVM到底是什么?

Java是一個非常實用的編程語言,

但你真的了解它嗎?


最近被很多事弄得焦頭爛額,好多事要忙,但又不想做。


現在的你,是不是也是如此?手邊一大堆的事情,卻一點都不想碰。罷了,前幾天給大家出了幾道題,說實話,我自己沒還沒怎么弄懂…………簡直腦袋爆炸。


今天為大家講一講關于JAVA的一些很小很小的干貨。


每個Java開發人員都知道字節碼由JRE(Java運行時環境)執行。但許多人不知道JRE是Java Virtual Machine(JVM)的實現,它分析字節碼,解釋代碼并執行它。作為開發人員,我們應該知道JVM的架構是非常重要的,因為它使我們能夠更有效地編寫代碼。在本文中,我們將更深入地了解Java中的JVM架構和JVM的不同組件。



什么是JVM?



Virtual Machine是物理機器的軟件實現。Java是用在VM上運行的WORA(Write Once Run Anywhere)概念而開發的。編譯器將Java文件編譯為Java .class文件,然后將.class文件輸入到JVM中,JVM會加載并執行類文件。下面是JVM的架構圖。



JVM如何工作?



如上面的架構圖所示,JVM分為三個主要子系統:


1、類加載器子系統

2、運行時數據區

3、執行引擎

1.類加載器子系統



Java的動態類加載功能由類加載器子系統處理。它在運行時,而不是編譯時首次引用類的時候加載、鏈接、并初始化類文件。



1.1加載



類將通過此組件加載。Boot Strap?Class?Loader,Extension?Class?Loader和Application?Class?Loader是有助于實現的三個類加載器。

1、Boot Strap Class Loader——負責加載來自于Bootstrap

類路徑的類,就是rt.jar。此加載程序將給予最高優先級。

2、Extension Class Loader——負責加載在ext文件夾(jre \ lib)內的類。

3、Application?Class?Loader——負責加載應用程序級類路徑,路徑提到環境變量等

上面的類記載器在加載類文件時遵循Delegation Hierarchy 算法。



1.2鏈接



1、驗證——字節碼驗證器將驗證生成的字節碼是否正確,如果驗證失敗,我們將得到verification error。

2、準備——對于所有的靜態變量,內存將被分配和配置默認值。

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



1.3初始化



這是類加載的最后階段,這里所有的靜態變量都將被賦予原始值,并執行靜態塊。



2.運行時數據區



運行時數據區分為5個主要組件:

方法區——所有的類級別數據將存儲在這里,包括靜態變量。每個JVM只有一個方法區,并且它是一個共享資源。

堆區域——所有對象及其對應的實例變量和數組將存儲在這里。每個JVM也有一個堆區域。由于方法和堆區域共享多個線程的內存,因此所存儲的數據非線程安全。

堆棧區——對于每個線程,將創建一個單獨的運行時棧。對于每個方法調用,將在堆棧存儲器中產生一個條目,稱為堆棧幀。所有局部變量將在堆棧內存中創建。堆棧區域是線程安全的,因為它不是共享資源。堆棧幀分為三個子元素:

1、局部變量數組——與方法相關,涉及局部變量以及將在此存儲的相應值的多少。

2、操作數堆?!绻枰獔绦腥魏沃虚g操作,那么操作數堆棧將充當運行時工作空間來執行操作。

3、幀數據——對應于方法的所有符號存儲在此處。在任何異常的情況下,捕捉塊信息將被保持在幀數據中。

PC寄存器——每個線程都有單獨的PC寄存器,用于保存當前執行指令的地址,一旦指令執行,PC寄存器將更新到下一條指令。

本地方法堆棧——本地方法堆棧保存本地方法信息。對于每個線程,將創建一個單獨的本地方法堆棧。



3.執行引擎



分配給運行時數據區的字節碼將由執行引擎執行。執行引擎讀取字節碼并逐個執行它。

解釋器——解釋器解釋字節碼較快,但執行慢。解釋器的缺點是當一個方法被多次調用時,每次都需要新的解析。

JIT編譯器——JIT編譯器消除了解釋器的缺點。執行引擎將在轉換字節碼時使用解釋器的幫助,但是當它發現重復的代碼時,它使用JIT編譯器,編譯器會編譯整個字節碼并將其更改為本地代碼。這個本地代碼將直接用于重復的方法調用,從而提高系統性能。

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

2、代碼優化器——負責優化上面生成的中間代碼

3、目標代碼生成器——負責生成機器代碼或本地代碼

4、分析器——一個特殊組件,負責查找熱點,即該方法是否被多次調用。

垃圾收集器:收集和刪除未引用的對象??梢酝ㄟ^調用“System.gc()”觸發垃圾收集器,但不能保證執行。JVM的垃圾回收收集創建的對象。

Java本機接口(JNI):JNI將與本地方法庫進行交互,并提供執行引擎所需的本地庫。

本地方法庫:它是執行引擎所需的本地庫的集合。



考慮到最近大家對那個愛情代碼挺感興趣,

小編決定,在公眾號底部的菜單里,

加一個愛情代碼,

為大家收集此類愛情代碼。

內容包括,純代碼,演示畫面,演示跳轉地址。

近日上線?。。?/p>



好啦,今天就到這里,

最近熬夜快累死了,忠告啊,能不熬夜就別熬夜了,

頭又開始疼了,晚安。




最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容