JVM体系结构:JVM和JVM体系结构概述
各位讀者好! 在本教程中,我們將了解和學習Java虛擬機(JVM)及其體系結(jié)構(gòu)。 本教程將幫助您正確回答以下問題:
- Java中的JVM是什么?
- JVM的不同組件
- JVM,JRE和JDK之間的區(qū)別
1.簡介
Java虛擬機(JVM)是??駐留在您的計算機上的抽象虛擬機,并為Java字節(jié)碼提供了運行時執(zhí)行環(huán)境。 JVM可用于許多硬件和軟件平臺,但是很少有Java開發(fā)人員知道Java運行時環(huán)境 (JRE)是Java虛擬機 (JVM)的制定。 JVM分析字節(jié)碼,對其進行解釋,然后執(zhí)行相同的字節(jié)碼以顯示輸出。
JVM的基本功能是執(zhí)行已編譯的.class文件(即字節(jié)碼)并生成輸出。 請注意 ,每個操作系統(tǒng)都有不同的JVM,但是在所有操作系統(tǒng)上生成的字節(jié)碼輸出都是相同的。 這意味著在Windows操作系統(tǒng)上生成的字節(jié)碼也可以在Linux操作系統(tǒng)上運行,反之亦然,從而使Java成為獨立于平臺的語言。
圖1:Java虛擬機概述
1.1 JVM有什么作用?
Java虛擬機執(zhí)行以下操作:
- 加載所需的.class和jar文件
圖2:JVM組件
1.2 Java虛擬機的類型
Java版本具有Java虛擬機(JVM)的兩種不同實現(xiàn),即
- Java Hotspot Client VM :這是JDK 2.0運行時環(huán)境的默認虛擬機,并通過減少應(yīng)用程序啟動時間和內(nèi)存占用量進行了調(diào)整,以在客戶端環(huán)境中運行應(yīng)用程序時獲得最佳性能。
- Java Hotspot Server VM :此虛擬機旨在提高程序執(zhí)行速度,以便在服務(wù)器環(huán)境中運行應(yīng)用程序。 通過使用服務(wù)器命令行選項來調(diào)用此虛擬機
1.3 JVM的內(nèi)部架構(gòu)
該圖顯示了符合JVM規(guī)范的Java虛擬機的關(guān)鍵內(nèi)部組件。
圖3:Java虛擬機架構(gòu)
下面說明圖3中所示的組件。
1.3.1類加載器
類加載器子系統(tǒng)用于加載/讀取.class文件,并將字節(jié)碼保存在JVM方法區(qū)域中。 該子系統(tǒng)執(zhí)行三個主要功能,即:
- 加載 :此組件處理類的加載
- 鏈接 :此組件將驗證生成的字節(jié)碼并分配引用
- 初始化 :此組件將為靜態(tài)變量分配其原始值并執(zhí)行靜態(tài)塊
1.3.2運行時數(shù)據(jù)區(qū)
該子系統(tǒng)分為五個主要部分,即
- 方法區(qū)域 :此組件保存每個.class文件的類級別數(shù)據(jù),例如元數(shù)據(jù),常量運行時池,靜態(tài)變量,方法的代碼等。每個JVM只有一個方法區(qū)域,并且在所有類之間共享
- 堆區(qū)域 :此組件是JVM內(nèi)存的一部分,所有對象及其對應(yīng)的實例變量和數(shù)組都存儲在JVM內(nèi)存中。 只有一個堆區(qū)域,并且在多個線程之間共享,因為該區(qū)域中存儲的數(shù)據(jù)不是線程安全的
- 堆棧區(qū)域 :該組件還是JVM內(nèi)存的一部分,所有臨時變量都存儲在該內(nèi)存中。 該區(qū)域具有堆棧幀,并為每個線程分配一個幀。 隨著線程執(zhí)行的完成,相應(yīng)的幀也會被破壞。 堆棧區(qū)域是線程安全的,因為它不是共享資源,并且分為三個子實體,例如:
- 局部變量數(shù)組
該區(qū)域在方法調(diào)用和返回期間起著重要作用。
- PC(程序計數(shù)器)寄存器 :該組件保存當前正在執(zhí)行的JVM指令的地址。 Java中的每個線程都有其自己的PC寄存器來保存當前執(zhí)行指令的地址
- 本機方法堆棧 :此組件用另一種語言編寫,并保存本機方法信息。 Java中的每個線程都有一個單獨的本機方法堆棧
1.3.3執(zhí)行引擎
該組件執(zhí)行分配給運行時數(shù)據(jù)區(qū)域的字節(jié)碼,并具有三個主要子組件,即:
- 解釋器 :此組件讀取字節(jié)碼指令并以順序方式執(zhí)行它們
- JIT(即時)編譯器 :該組件抵消了解釋器執(zhí)行緩慢的缺點,并提高了性能。 JIT編譯器同時編譯字節(jié)碼的相似部分,從而減少了編譯所需的總時間。 該組件中的編譯器是指將JVM指令集轉(zhuǎn)換為特定于OS的指令集的轉(zhuǎn)換器
- 垃圾收集 :此組件是執(zhí)行引擎的一部分,該引擎通過收集和刪除未引用的對象來釋放內(nèi)存
圖4:JVM中的執(zhí)行引擎
1.3.4本機方法接口(JNI)
該組件是一個編程框架,它允許Java代碼調(diào)用庫或本機應(yīng)用程序(即特定于系統(tǒng)的硬件和OS的程序)或由其調(diào)用。
1.3.5本機方法庫
該組件是執(zhí)行引擎所需的本機C,C ++庫的集合。
1.4 JVM與JRE與JDK
JDK,JRE和JVM是Java編程的三個重要關(guān)鍵字,許多開發(fā)人員未能將二者區(qū)分開。
- Java虛擬機(JVM) :JVM是一種虛擬機,為執(zhí)行Java字節(jié)碼提供了運行時環(huán)境
- Java運行時環(huán)境(JRE) :JRE是一個運行JVM的環(huán)境,并具有Java虛擬機在執(zhí)行時使用的類庫和其他文件。 換句話說,JRE = Java虛擬機(JVM)+運行該應(yīng)用程序的庫
- Java開發(fā)工具包(JDK) :JDK是JRE的父集,具有JRE以及開發(fā)工具(如編譯器,調(diào)試器等)所包含的所有內(nèi)容。換句話說,JDK = Java運行時環(huán)境(JRE)+開發(fā)工具
這是JVM,JRE和JDK的圖形表示。
圖5:JVM,JRE和JDK表示形式
1.5如何編譯和執(zhí)行Java類?
本節(jié)將演示Java類的編譯和執(zhí)行 。 讓我們借助示例代碼片段來了解此過程。
1.5.1創(chuàng)建Java文件
打開操作系統(tǒng)命令提示符,我們將使用“記事本”創(chuàng)建一個簡單的Java類。 可以使用以下Java命令。
> notepad _sample_file_name_with_extension_該命令提供以下輸出。
圖6:使用記事本創(chuàng)建Java文件
1.5.2編寫示例Java代碼
如圖6所示,該命令將打開一個記事本 ,開發(fā)人員可以將示例代碼添加到顯示虛擬輸出的Welcome.java文件中。 示例代碼如圖7所示, 成功執(zhí)行后將顯示問候消息。
圖7:添加示例代碼
1.5.3編譯Java類
將代碼保存在Welcome.java文件中后,開發(fā)人員將需要對其進行編譯 。 該編譯將生成Welcome.class文件,該文件又將生成一個.class文件。 要編譯該文件,可以使用以下Java命令。
> javac _Java_file_name_with_extension_該命令提供以下輸出。
圖8:編譯文件
1.5.4執(zhí)行Java類
現(xiàn)在,開發(fā)人員將需要執(zhí)行生成的Welcome.class文件以顯示輸出。 要執(zhí)行該文件,可以使用以下Java命令。
> java _Compiled_file_name_with_extension_該命令提供以下輸出。
圖9:執(zhí)行文件
這就是這篇文章的全部內(nèi)容。 學習愉快!
2.結(jié)論
在本教程中,我們對Java虛擬機(JVM)及其核心組件進行了概述。 本教程可以總結(jié)為:
- JVM是執(zhí)行Java代碼并通過將Java字節(jié)碼轉(zhuǎn)換為機器語言來產(chǎn)生輸出的虛擬機
- JIT編譯器是JVM的子組件,用于加快性能和執(zhí)行時間
- Java的執(zhí)行速度很慢 ,原因是:
- 動態(tài)鏈接
但是,這些瓶頸性能問題在新的Java Development Kit( JDK )版本中得到了一定程度的解決。 開發(fā)人員可以在“ 下載”部分下載示例代碼片段。
3.下載源代碼
這是Java虛擬機(JVM)及其核心組件的概述教程。
下載您可以在此處下載本教程的源代碼: JVM_Example
翻譯自: https://www.javacodegeeks.com/2018/04/jvm-architecture-overview-of-jvm-and-jvm-architecture.html
總結(jié)
以上是生活随笔為你收集整理的JVM体系结构:JVM和JVM体系结构概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑dlna投电视(电视dlna怎么连接
- 下一篇: servlet3异步_Servlet 3