JVM工作原理

作為一名Java開發者,掌握JVM的體系結構也是很有必要的,瞭解底層的東西,有助於更好的理解和掌握程序運行中的原理。

一、Java運行原理

說起Java,我們首先想到的是Java編程語言,然而事實上,Java是一種技術,它由四方面組成:Java編程語言、Java類文件格式、Java虛擬機和Java應用程序接口(Java API)。它們的關係如下圖所示:

JVM工作原理

二、JVM的運行原理

  1. 基本概念:JVM是可運行Java代碼的假想計算機 ,包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收,堆 和 一個存儲方法域。JVM是運行在操作系統之上的,它與硬件沒有直接的交互。

  2. 運行過程:我們都知道Java源文件,通過編譯器,能夠生產相應的.Class文件,也就是字節碼文件,而字節碼文件又通過Java虛擬機中的解釋器,編譯成特定機器上的機器碼 。具體如下分為兩個步驟:

    ① Java源文件—->編譯器—->字節碼文件

    ② 字節碼文件—->JVM—->機器碼

    每一種平臺的解釋器是不同的,但是實現的虛擬機是相同的,這也就是Java為什麼能夠跨平臺的原因了 ,當一個程序從開始運行,這時虛擬機就開始實例化了,多個程序啟動就會存在多個虛擬機實例。程序退出或者關閉,則虛擬機實例消亡,多個虛擬機實例之間數據不能共享。

3.JVM的體系結構:

JVM工作原理

JVM工作原理

(1) Class Loader類加載器:

負責加載 .class文件,class文件在文件開頭有特定的文件標示,並且ClassLoader負責class文件的加載等,至於它是否可以運行,則由Execution Engine決定。

(2) Native Interface本地接口:

本地接口的作用是融合不同的編程語言為Java所用,它的初衷是融合C/C++程序,Java誕生的時候C/C++橫行的時候,要想立足,必須有調用C/C++程序,於是就在內存中專門開闢了一塊區域處理標記為native的代碼,它的具體作法是Native Method Stack中登記native方法,在Execution Engine執行時加載native libraies.

(3) Execution Engine 執行引擎:執行包在裝載類的方法中的指令,也就是方法。

(4) Runtime data area 運行數據區:

JVM內存,衝整個計算機內存中開闢一塊內存存儲Jvm需要用到的對象,變量等,運行區數據有分很多小區,分別為:方法區,虛擬機棧,本地方法棧,堆,程序計數器。

4.JVM數據運行區詳解:

JVM數據運行區中,棧主要負責運行,堆負責存儲,一般來說,JVM調優主要就是優化 Heap堆 和 Method Area 方法區。

JVM工作原理

(1) Native Method Stack本地方法棧

它的具體做法是Native Method Stack中登記native方法,在Execution Engine執行時加載native libraies。

(2) PC Register程序計數器

每個線程都有一個程序計算器,就是一個指針,指向方法區中的方法字節碼(下一個將要執行的指令代碼),由執行引擎讀取下一條指令,是一個非常小的內存空間,幾乎可以忽略不記。

(3) Method Area方法區

方法區是被所有線程共享,所有字段和方法字節碼,以及一些特殊方法如構造函數,接口代碼也在此定義。簡單說,所有定義的方法的信息都保存在該區域,此區域屬於共享區間。

靜態變量+常量+類信息+運行時常量池存在方法區中,實例變量存在堆內存中。

(4) Stack 棧:棧也叫棧內存,主管Java程序的運行,是在線程創建時創建,它的生命期是跟隨線程的生命期,線程結束棧內存也就釋放,對於棧來說不存在垃圾回收問題,只要線程一結束該棧就Over,生命週期和線程一致,是線程私有的, 基本類型的變量和對象的引用變量都是在函數的棧內存中分配。遵循“先進後出”/“後進先出”原則。

(5) Heap 堆:堆這塊區域是JVM中最大的,應用的對象和數據都是存在這個區域,這塊區域也是線程共享的,也是 gc 主要的回收區,一個 JVM 實例只存在一個堆類存,堆內存的大小是可以調節的。類加載器讀取了類文件後,需要把類、方法、常變量放到堆內存中,以方便執行器執行。

JVM工作原理


分享到:


相關文章: