首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

深入解析 Java 虛擬機體系結構與記憶體模型

     編輯:Java 綜合教學

深入解析 Java 虛擬機體系結構與記憶體模型

隨著程式碼量增長,系統效能逐漸成為開發者關注的焦點。除了優化程式結構,記憶體優化與效能調優更是提升系統穩定性的關鍵。要真正掌握 Java 程式的調優精髓,必須深入理解 Java 虛擬機(JVM)的內部運作原理與規範。推薦閱讀《深入 Java 虛擬機(第二版)》,透過系統性的學習,能幫助我們編寫出更高效、穩定的 Java 代碼。

例如,了解 JVM 記憶體模型與垃圾回收機制,可避免過度依賴自動回收,適時釋放物件引用以減少記憶體佔用;掌握 Java 棧運作原理,則能透過減少遞迴深度與迴圈次數來降低堆疊溢位風險。這些底層知識雖不直接參與業務開發,卻能潛移默化地提升程式碼品質。

本文將簡明扼要地闡述 JVM 體系結構與記憶體模型,如有不當之處,敬請指正。

JVM 體系結構概覽

類載入子系統

JVM 擁有兩類類載入器:啟動類載入器與使用者自定義類載入器。類載入子系統依據類的全限定名(包含套件名、類名,網路載入時還包含 URL)將 Class 檔案載入運行時資料區。對於每個被載入的類型,JVM 都會在堆區建立一個 java.lang.Class 實例代表該類型,而類型資訊則儲存於方法區。

類載入過程嚴格遵循以下順序:

  1. 載入:查找並載入類型的二進位資料。
  2. 連接:包含驗證、準備、解析(可選)三個階段。
    • 驗證:確保被導入類型的正確性。
    • 準備:為類變數配置記憶體並初始化為預設值。
    • 解析:將類型中的符號引用轉換為直接引用。

方法區

方法區儲存每個被類載入子系統載入的類型資訊,主要包含:

  • 類型的全限定名
  • 父類型的全限定名(java.lang.Object 無父類)
  • 類型是類還是介面
  • 存取修飾符
  • 直接父介面的全限定名有序列表

此外,還儲存以下資訊:

  • 類型的常量池
  • 欄位資訊(名稱、類型、修飾符)
  • 方法資訊(名稱、返回類型、參數數量與類型、修飾符,非抽象與本地方法還包含位元碼、操作數棧、區域變數表大小、異常表)
  • 非常量的類變數(即 static 變數,因為被所有實例共享,屬於類層級)

方法區也會被垃圾回收器回收。

堆

所有執行緒共享一個堆,Java 程式運行時建立的所有類實例與陣列均放置於此。這正是多執行緒環境下物件存取同步問題的根源。不同 JVM 實作對堆中物件表示形式可能不同,但通常包含物件頭(類資訊指標、同步鎖等)與實例資料。

程式計數器

每個執行緒擁有獨立的 PC 暫存器,大小為一個字長,儲存下一條將執行的指令位址。

Java 棧

每個執行緒擁有一個 Java 棧,以棧幀為單位保存執行狀態。棧幀包含傳入參數、區域變數、中間運算結果等,方法完成時彈出並釋放。

本地方法棧

支援 JNI(Java Native Interface),用於呼叫作業系統本地函式庫。

執行引擎

JVM 核心組件,負責載入並解析執行 Java 位元碼。每個執行緒都是一個獨立的執行引擎實例,生命週期內要么執行位元碼,要么執行本地方法。

本地介面

連接本地方法棧與作業系統函式庫。

註:文中「Java 虛擬機」均指 Java EE 與 Java SE 平台的 JVM 規範。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved