jvm結構解釋

唐軒發表於2017-11-12

每個Java開發人員都知道位元組碼將被執行JRE(Java執行時環境)。 但很多人並不知道這一事實JRE的實現Java虛擬機器(JVM),分析了位元組碼解釋的程式碼,並執行它。 作為開發人員是非常重要的,我們應該知道JVM的架構,因為它使我們能夠更有效地編寫程式碼。 在本文中,我們將更深入地瞭解JVM體系結構在Java和不同的元件的JVM。

JVM是什麼?

一個虛擬機器是一種軟體實現的物理機器。 Java開發的概念WORA(一次編寫到處執行), 執行在一個虛擬機器。 的編譯器到Java編譯Java檔案. class檔案,然後,. class檔案輸入到JVM載入和執行類檔案。 下面是一個JVM的架構圖。

JVM架構圖

JVM是如何工作的呢?

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

類裝入器子系統
執行時資料區
執行引擎
1。 類裝入器子系統

Java的動態類載入功能是由類裝入器子系統。 它裝載的連結。 並初始化類檔案時,它是指一個類第一次執行時,而不是編譯時間。

1.1裝貨

將由該元件載入類。 模擬線路類裝入器、擴充套件類載入器和應用程式類載入器是三個類載入器將幫助實現它。

輔助程式類載入器——負責引導類路徑載入類,除了rt.jar。最高優先順序將裝載機。
擴充套件類載入器——負責裝入類內部ext資料夾(jre lib)。
應用程式類載入器負責載入應用程式級別的類路徑提到,路徑環境變數等。
上面的類載入器將遵循代表團層次演算法而載入的類檔案。

1.2連線

驗證——位元組碼校驗器會檢查生成的位元組碼是否正確如果驗證失敗我們會驗證錯誤。
準備——對於所有靜態變數的記憶體分配和分配預設值。
解決——所有象徵性的記憶體引用替換為最初的引用從方法區。
1.3初始化

這是類裝入的最後階段,這裡所有的人靜態變數 與原來的值將被指派,靜態塊將被執行。

2。 執行時資料區

執行時資料區域分為5個主要元件:

方法區——所有的類級別的資料將儲存在這裡,包括靜態變數。 每個JVM區域只有一個方法,它是一個共享資源。
堆區域——所有的物件和相應的例項變數和陣列將儲存在這裡。 還有一堆區域每個JVM。 自方法和堆區域多個執行緒共享記憶體,儲存的資料不是執行緒安全的。
堆疊區域——每一個執行緒,一個單獨的執行時堆疊將被建立。 對於每一個方法呼叫,一個條目將稱為棧記憶體堆疊幀。 所有區域性變數將被建立在棧記憶體中。 堆疊區域是執行緒安全的,因為它不是一個共享資源。 堆疊幀分為三個實體:
區域性變數陣列——有多少相關的方法區域性變數以及相應的值將被儲存在這裡。
運算元棧——如果任何中間操作要求執行,運算元棧作為執行時工作區執行操作。
幀資料——所有的符號對應的方法儲存在這裡。 在任何的情況下異常catch塊資訊將儲存在幀資料。
電腦註冊——每個執行緒必須分開PC暫存器,的地址當前執行的指令一旦指令執行PC暫存器更新下一個指令。
本地方法棧——本地方法棧儲存本機方法的資訊。 為每一個執行緒,將建立一個單獨的本地方法棧。
3所示。 執行引擎

被分配到的位元組碼執行時資料區將執行的執行引擎。 位元組碼的執行引擎讀取並執行這一塊一塊的。

翻譯——直譯器解釋位元組碼的速度,但執行緩慢。 直譯器的缺點是,當一個方法被呼叫多次,每次都需要一個新的解釋。
JIT編譯器——JIT編譯器中和直譯器的缺點。 執行引擎將使用翻譯的幫助轉換位元組碼,但是當它發現重複的程式碼它使用JIT編譯器,編譯整個位元組碼和改變本機程式碼。 這將使用本機程式碼直接重複方法呼叫,從而改善系統的效能。
中間程式碼生成器生成中間程式碼
程式碼優化器——負責優化生成中間程式碼
目的碼生成器——負責生成機器程式碼或本機程式碼
分析器-一個特殊的元件,負責尋找熱點,即是否多次呼叫的方法。
垃圾收集器:收集並刪除未引用的物件。 垃圾收集可以通過呼叫觸發“system . gc()”,但執行是沒有保證的。 JVM的垃圾收集收集建立的物件。
Java Native Interface(JNI):JNI將互動本機方法庫並提供所需的本地庫執行引擎。

本機方法庫:這是一個收集的本地庫所需的執行引擎。

如果你還想學習Java工程化、高效能及分散式、高效能、深入淺出。效能調優、Spring,MyBatis,Netty原始碼分析和大資料等知識點可以來找我。

而現在我就有一個平臺可以提供給你們學習,讓你在實踐中積累經驗掌握原理。主要方向是JAVA架構師。如果你想拿高薪,想突破瓶頸,想跟別人競爭能取得優勢的,想進BAT但是有擔心面試不過的,可以加我的Java架構進階群:514790886

注:加群要求

1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。
5.阿里Java高階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!
6.小號加群一律不給過,謝謝。
轉發此文章請帶上原文連結,否則將追究法律責任!

相關文章