當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java JIT和JVM的區別用法及代碼示例


Java虛擬機(JVM)用於java運行環境(JRE)。最初的 JVM 被認為是字節碼解釋器。由於性能問題,這可能會讓人感到有點意外。許多現代語言都旨在編譯成CPU-specific可執行代碼。然而,JVM 執行 Java 程序這一事實有助於解決與基於 Web 的應用程序相關的主要問題。

JVM 執行 Java 程序這一事實也有助於使其穩定。由於JVM負責,程序的執行是由它控製的。因此,JVM 可以構建一個稱為沙箱的有限執行區域,其中包含軟件,從而防止係統獲得無限製的訪問。 Java 語言中存在的一些限製也改進了保護。 Java的JVM架構包括類加載器、執行引擎、內存字段等。

為了理解差異,讓我們通過說明 JVM 的工作原理來深入了解這些組件。

  • ClassLoader類加載器的目的是加載類文件。它有助於完成三個主要函數:加載、初始化和鏈接。
  • JVM語言棧Java 內存存儲局部變量和部分計算結果。每個線程都有自己的 JVM 堆棧,在創建線程時創建。調用該方法時,將創建一個新框架,然後將其刪除。
  • 方法區:JVM 方法區專門存儲 Java 應用程序的元數據和 code-behind 文件。
  • 電腦寄存器:當前正在執行的Java虛擬機指令地址由PC寄存器保存。 Java 中的每個線程都有自己獨立的 PC 寄存器。
  • Heap:堆中保存了所有對象、數組和實例變量。該內存在多個線程之間共享。
  • 執行引擎:它是一種用於測試軟件、硬件或完整係統的軟件形式。測試執行引擎從不攜帶任何有關被測試產品的信息。
  • 本機方法庫執行引擎需要本機庫(C、C++),而作為編程框架的本機方法接口是本機方法接口。這使得在 JVM 中運行的 Java 代碼能夠調用庫和本機應用程序。此外,本機方法堆棧具有取決於本機庫的本機代碼命令。它將存儲分配給本機堆或使用任何堆棧類型。

即時 (JIT) 編譯器

雖然 Java 是作為解釋性語言開發的,但為了提高性能,Java 並不會阻止 bytecode 即時編譯為本機代碼。因此,在 Java 首次發布後不久,HotSpot JVM 就發布了。 HotSpot 中包含即時 (JIT) 字節碼編譯器。即時 (JIT) 編譯器是 JVM 的一部分,根據 piece-by-piece 需求,字節碼的選定部分被實時編譯為可執行代碼。也就是說,根據執行期間的需要,JIT 編譯器會編譯代碼。此外,並非所有字節碼序列都會被編譯,隻有那些將從編譯中受益的字節碼序列才會被編譯。然而,即時方法仍然會導致效率低下。即使對字節碼應用動態編譯,由於JVM仍然控製著執行環境,因此可移植性和安全性函數仍然存在。

為了理解差異,讓我們通過說明 JIT 的工作原理來深入了解組件。

解釋字節碼時,JVM 的標準實現會減慢程序的執行速度。 JIT 編譯器在運行時與 JVM 交互,以提高性能並將適當的字節碼序列編譯為本機機器代碼。

硬件而不是 JVM(Java 虛擬機)解釋代碼。這可以提高執行速度。這可以在 per-file、per-function 或任何任意代碼片段上完成;代碼通常在接近執行時進行編譯(因此得名“just-in-time”),然後進行緩存並在以後重用,而無需重新編譯。它執行許多優化:數據分析、從堆棧操作到注冊表操作的轉換、通過注冊表分配減少內存訪問、消除公共子表達式。

因此,根據上述知識,我們得出了它們之間的決定性差異,如下表所示:

JVM

JIT

JVM 代表 Java 虛擬機。 JIT 代表即時編譯。
引入 JVM 是為了管理係統內存並為基於 Java 的應用程序提供可傳輸的執行環境 JIT 最初發布多年後,是為了提高 JVM 的性能而發明的。
JVM 由許多其他組件組成,例如堆棧區域、堆區域等。 JIT是JVM的組件之一。
JVM 將完整的字節代碼編譯為機器代碼。 JIT 僅將可重用的字節代碼編譯為機器代碼。
JVM 提供平台獨立性。 JIT 提高了 JVM 的性能。

相關用法


注:本文由純淨天空篩選整理自priyavermaa1198大神的英文原創作品 Difference between JIT and JVM in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。