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 代碼能夠調用庫和本機應用程序。此外,本機方法堆棧具有取決於本機庫的本機代碼命令。它將存儲分配給本機堆或使用任何堆棧類型。
雖然 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 的性能。 |
相關用法
- Java Java.io.BufferedInputStream.available()用法及代碼示例
- Java Java.io.BufferedInputStream.close()用法及代碼示例
- Java Java.io.BufferedInputStream.read()用法及代碼示例
- Java Java.io.BufferedInputStream.reset()用法及代碼示例
- Java Java.io.BufferedInputStream.skip()用法及代碼示例
- Java Java.io.BufferedOutputStream.flush()用法及代碼示例
- Java Java.io.BufferedOutputStream.Write()用法及代碼示例
- Java Java.io.BufferedReader.Close()用法及代碼示例
- Java Java.io.BufferedReader.mark()用法及代碼示例
- Java Java.io.BufferedReader.markSupported()用法及代碼示例
- Java Java.io.BufferedReader.read()用法及代碼示例
- Java Java.io.BufferedReader.readline()用法及代碼示例
- Java Java.io.BufferedReader.ready()用法及代碼示例
- Java Java.io.BufferedReader.reset()用法及代碼示例
- Java Java.io.BufferedReader.skip()用法及代碼示例
- Java Java.io.BufferedWriter.close()用法及代碼示例
- Java Java.io.BufferedWriter.flush()用法及代碼示例
- Java Java.io.BufferedWriter.newLine()用法及代碼示例
- Java Java.io.BufferedWriter.write()用法及代碼示例
- Java Java.io.ByteArrayInputStream.available()用法及代碼示例
- Java Java.io.ByteArrayInputStream.close()用法及代碼示例
- Java Java.io.ByteArrayInputStream.mark()用法及代碼示例
- Java Java.io.ByteArrayInputStream.read()用法及代碼示例
- Java Java.io.ByteArrayInputStream.reset()用法及代碼示例
- Java Java.io.ByteArrayInputStream.skip()用法及代碼示例
注:本文由純淨天空篩選整理自priyavermaa1198大神的英文原創作品 Difference between JIT and JVM in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。