Java 虛擬機器

JVM-Java 虛擬機器是一個引擎,它提供執行環境來驅動 Java 程式碼或應用程式。它將 Java 位元組碼轉換為機器語言。JVM 是 JRE(Java Run Environment-Java 執行環境)的一部分。

  • 在其他程式語言中,編譯器為特定系統生成機器程式碼。但是,Java 編譯器為稱為 Java 虛擬機器的虛擬機器生成程式碼。
  • 首先,Java 程式碼被編譯為位元組碼。此位元組碼在不同的機器再被解釋
  • 在主機系統和 Java 源之間,位元組碼是一種中間語言。
  • JVM 負責分配記憶體空間。

在本教程中,你將學習 -

  • 什麼是 JVM?
  • JVM 架構
  • 軟體程式碼編譯和執行過程
  • C 程式碼編譯和執行過程
  • Java 程式碼編譯和執行過程
  • 為什麼 Java 既解釋又編譯語言?
  • 為什麼 Java 慢?

JVM 架構

讓我們瞭解 JVM 的體系結構。它包含類載入器、記憶體區域、執行引擎等。

![Java 虛擬機器(JVM)及其架構的工作](/img/Java/JVM and its Architecture.png)

1)ClassLoader

類載入器是用於載入類檔案的子系統。它執行三個主要功能即載入、連結和初始化。

2)方法區

JVM 方法區域儲存類結構,如後設資料、常量執行時池和方法程式碼。

3)堆

所有物件,它們的相關例項變數和陣列都儲存在堆中。此記憶體是共用的,可以跨多個執行緒共享。

4)JVM 語言堆疊

Java 語言堆疊儲存區域性變數。每個執行緒都有自己的 JVM 堆疊,在建立執行緒時同時被建立。每當呼叫方法時都會建立一個新幀,並在方法呼叫過程完成後刪除它。

5)PC 暫存器

PC 暫存器儲存當前正在執行的 Java 虛擬機器指令的地址。在 Java 中,每個執行緒都有其獨立的 PC 暫存器。

6)原生方法堆疊

本機方法堆疊取決於本機庫儲存本機程式碼的指令。它是用另一種語言而不是用 Java 編寫的。

7)執行引擎

它是一種用於測試硬體、軟體或完整系統的軟體。測試執行引擎從不具帶有關測試產品的任何資訊。

8)原生方法介面

原生方法介面是一個程式設計框架。它允許在 JVM 中執行的 Java 程式碼由庫和原生應用程式呼叫。

9)原生方法庫

原生庫是執行引擎所需的本機庫(C,C++)的集合。

軟體程式碼編譯和執行過程

要編寫和執行軟體程式,你需要以下工具,

1)編輯器 - 用來輸入你的程式,可以使用比如記事本

2)編譯器 - 將高階語言程式轉換為本機程式碼

3)連結器 - 將主程式中的不同程式檔案引用組合在一起。

4)載入器 - 將檔案從二級儲存裝置(如硬碟,快閃記憶體驅動器,CD)載入到記憶體中執行。執行程式碼時會自動完成載入。

5)執行 - 實際執行由你的作業系統和處理器處理的程式碼。

C 程式碼編譯和執行過程

要了解 Java 中的 Java 編譯過程。讓我們先快速瞭解一下 C 中的編譯和連結過程。

假設在 main 中,你呼叫了兩個函式 f1 和 f2。主函式儲存在檔案 a1.c 中。

// a1.c
void main()
{
    f1();
    f2();
}

函式 f1 儲存在檔案 a2.c

// a2.c
f1()
{
    ;
}

函式 f2 儲存在檔案 a3.c

// a3.c
f2()
{
    ;
}

所有這些檔案,即 a1.ca2.ca3.c,都被送到編譯器。其輸出是相應的目標檔案,即機器程式碼。

下一步是在連結器的幫助下將所有這些目標檔案整合到單個 .exe 檔案中。連結器將所有這些檔案組合在一起並生成 .exe 檔案。

在程式執行期間,載入程式會將 a.exe 載入到記憶體中以執行。

Java 程式碼 Java VM 中的編譯和執行

讓我們看看 JAVA 的過程。在你的主體中,你有兩個方法 f1 和 f2。

  • main 方法儲存在檔案 a1.java
  • f1 儲存在檔案 a2.java
  • f2 儲存在檔案 a3.java

![Java 編譯器](/img/Java/Java Compiler.jpg)

編譯器將編譯這三個檔案並生成 3 個相應的 .class 檔案,該檔案由位元組碼組成。與 C 不同,它們並沒有連結在一起。

Java 虛擬機器駐留在記憶體上。在執行期間,使用類載入器將類檔案放在記憶體上。位元組碼已經針對任何安全漏洞都做了驗證。

接下來,執行引擎將位元組碼轉換為原生機器程式碼。這是即時編譯,這就是 Java 相對較慢的主要原因之一。

注意: JIT 或即時編譯器是 Java 虛擬機器(JVM)的一部分。

為什麼 Java 既是解釋語言同時又是編譯語言?

程式語言分類為

  • 高階語言比如 C++Java
  • 中級語言比如 C
  • 低階語言比如組合語言
  • 最後最低階別是機器語言

編譯器是一個程式,它將程式從一種語言級別轉換為另一種語言級別,比如將 C++ 程式轉換為機器程式碼。

Java 編譯器將高階 java 程式碼轉換為位元組碼(也是一種機器程式碼)。

直譯器是一個程式,它將一個級別的程式轉換為另一個級別的另一個程式語言,比如將 Java 程式轉換為 C++

在 Java 中,即時編碼生成器將位元組碼轉換為處於相同程式設計級別的本機機器程式碼。

因此,Java 既可以編譯也可以解釋語言。

Java 為什麼慢?

Java 慢的背後的兩個主要原因是

  1. **動態連結:**與 C 不同,每次程式在 Java 中執行時,連結都是在執行時完成的。
  2. **執行時直譯器:**位元組程式碼轉換為本機機器程式碼是在 Java 執行時完成的,這進一步降低了速度

但是,最新版本的 Java 在很大程度上解決了效能瓶頸問題。

摘要

  • JVM 或 Java 虛擬機器是驅動 Java 程式碼的引擎。它將 Java 位元組碼轉換為機器語言。
  • 在 JVM 中,Java 程式碼被編譯為位元組碼。此位元組碼在不同的機器上解釋
  • JIT 或 Just-in-time 編譯器是 Java 虛擬機器(JVM)的一部分。它用於加快執行時間
  • 與其他編譯器機器相比,Java 執行速度可能會很慢。