Java教程

Java控制語句

面向物件程式設計

Java內建類

Java檔案處理

Java錯誤與異常

Java多執行緒

Java同步

Java網路程式設計

Java集合

Java介面

Java資料結構

Java集合演算法

高階Java

Java雜項

Java APIs與框架

Java類參考

Java實用資源

JVM(Java虛擬機器)架構



什麼是JVM(Java虛擬機器)?

JVM(Java虛擬機器)是一個虛擬機器,一個抽象的計算機,擁有自己的指令集架構(ISA)、記憶體、堆疊、堆等。它執行在主機作業系統上,並向其提出資源需求。

JVM(Java虛擬機器)是一個規範,只要符合規範,就可以有不同的實現。規範可以在以下連結中找到:https://docs.oracle.com

Oracle有自己的JVM實現(稱為HotSpot JVM),IBM也有自己的(例如J9 JVM)。

規範中定義的操作如下所示(來源 - Oracle JVM規範)

  • “.class”檔案格式
  • 資料型別
  • 基本型別和值
  • 引用型別和值
  • 執行時資料區域
  • 棧幀
  • 物件的表示
  • 浮點運算
  • 特殊方法
  • 異常
  • 指令集摘要
  • 類庫
  • 公共設計,私有實現

JVM(Java虛擬機器)架構

HotSpot JVM 3 的架構如下所示:

Architecture

執行引擎包含垃圾收集器和JIT編譯器。JVM有兩種型別:客戶端伺服器端。兩者共享相同的執行時程式碼,但使用的JIT不同。稍後我們將詳細瞭解這一點。使用者可以透過指定JVM標誌 -client 或 -server 來控制使用哪種型別。伺服器端JVM是為伺服器上長期執行的Java應用程式設計的。

JVM有32位和64位版本。使用者可以使用VM引數中的-d32或-d64來指定要使用的版本。32位版本最多隻能定址4G記憶體。對於在記憶體中維護大型資料集的關鍵應用程式,64位版本可以滿足這一需求。

JVM(Java虛擬機器)架構的組成部分

以下是JVM(Java虛擬機器)架構的主要組成部分:

1. 類載入器

JVM以動態的方式管理載入、連結和初始化類和介面的過程。在載入過程中,JVM查詢類的二進位制表示並建立它。

在連結過程中,載入的類被組合到JVM的執行時狀態中,以便它們可以在初始化階段執行。JVM基本上使用儲存在類的方法區域的執行時常量池中的符號表來進行連結過程。初始化包括實際執行連結的類

以下是類載入器的型別:

  • 引導類載入器:此類載入器位於類載入器層次結構的頂部。它載入JRE的lib目錄中的標準JDK類。
  • 擴充套件類載入器:此類載入器位於類載入器層次結構的中間,是引導類載入器的直接子類,載入JRE的lib\ext目錄中的類。
  • 應用程式類載入器:此類載入器位於類載入器層次結構的底部,是應用程式類載入器的直接子類。它載入由CLASSPATH ENV變數指定的jar和類。

2. 連結和初始化

連結過程包含以下三個步驟:

  • 驗證 - 這由位元組碼驗證器完成,以確保生成的.class檔案(位元組碼)有效。如果不是,則丟擲錯誤,連結過程停止。
  • 準備 - 為類的所有靜態變數分配記憶體,並使用預設值初始化它們。
  • 解析 - 所有符號記憶體引用都替換為原始引用。為此,使用了類的方法區域中執行時常量記憶體中的符號表。

初始化是類載入過程的最後階段。靜態變數被賦予原始值,並執行靜態塊。

3. 執行時資料區域

JVM規範定義了程式執行期間需要的某些執行時資料區域。其中一些在JVM啟動時建立。其他區域是特定於執行緒的,只有在建立執行緒時才建立(並在執行緒銷燬時銷燬)。這些列在下面:

PC(程式計數器)暫存器

它特定於每個執行緒,幷包含執行緒當前正在執行的JVM指令的地址。

它特定於每個執行緒,在方法呼叫期間儲存引數、區域性變數和返回地址。如果執行緒請求的堆疊空間超過允許的範圍,則可能會發生StackOverflowError。如果堆疊是動態可擴充套件的,它仍然可以丟擲OutOfMemoryError。

它被所有執行緒共享,包含在執行時建立的物件、類的元資料、陣列等。它在 JVM 啟動時建立,在 JVM 關閉時銷燬。您可以使用某些標誌控制 JVM 向作業系統請求的堆大小(稍後詳細介紹)。需要注意的是,不要請求過少或過多的記憶體,因為它會嚴重影響效能。此外,GC 管理此空間,並持續刪除不再使用的物件以釋放空間。

方法區

這個執行時區域對所有執行緒都是通用的,在 JVM 啟動時建立。它儲存每個類的結構,例如常量池(稍後詳細介紹)、建構函式和方法的程式碼、方法資料等。《Java 語言規範》(JLS) 沒有規定此區域是否需要進行垃圾回收,因此,JVM 的實現可以選擇忽略 GC。此外,它可以根據應用程式的需求進行擴充套件或不擴充套件。JLS 對此沒有任何強制規定。

執行時常量池

JVM 維護一個每個類/每個型別的、用作符號表(它的眾多角色之一)的資料結構,用於連結已載入的類。

本地方法棧

當執行緒呼叫本地方法時,它會進入一個新的環境,在這個環境中,Java 虛擬機器的結構和安全限制不再限制它的自由。本地方法可能會訪問虛擬機器的執行時資料區域(取決於本地方法介面),但也可能執行任何其他操作。

4. 執行引擎

執行引擎負責執行位元組碼,它包含三個不同的元件

垃圾回收

JVM 管理 Java 中物件的整個生命週期。一旦建立了物件,開發人員就不必再擔心它。如果物件變成不再使用(即,不再有對它的引用),它將由 GC 使用多種演算法(序列 GC、CMS、G1 等)從堆中移除。

另請閱讀: Java 中的垃圾回收

在 GC 過程中,物件會在記憶體中移動。因此,在該過程進行期間,這些物件不可用。整個應用程式必須在該過程持續時間內停止。此類暫停稱為“停止世界”暫停,並且開銷巨大。GC 演算法的主要目標是減少此時間。

直譯器

直譯器解釋位元組碼。它解釋程式碼的速度很快,但執行速度很慢。

JIT 編譯器

JIT 代表 Just-In-Time(即時)。JIT 編譯器是 Java 執行時環境的主要部分,它在執行時將位元組碼編譯為機器碼。

5. Java 本地介面 (JNI)

Java 本地介面 (JNI) 與對執行必不可少的本地方法庫互動。

6. 本地方法庫

本地方法庫是 C 和 C++ 庫(本地庫)的集合,對執行必不可少。

廣告