隨著程式碼量增長,系統效能逐漸成為開發者關注的焦點。除了優化程式結構,記憶體優化與效能調優更是提升系統穩定性的關鍵。要真正掌握 Java 程式的調優精髓,必須深入理解 Java 虛擬機(JVM)的內部運作原理與規範。推薦閱讀《深入 Java 虛擬機(第二版)》,透過系統性的學習,能幫助我們編寫出更高效、穩定的 Java 代碼。
例如,了解 JVM 記憶體模型與垃圾回收機制,可避免過度依賴自動回收,適時釋放物件引用以減少記憶體佔用;掌握 Java 棧運作原理,則能透過減少遞迴深度與迴圈次數來降低堆疊溢位風險。這些底層知識雖不直接參與業務開發,卻能潛移默化地提升程式碼品質。
本文將簡明扼要地闡述 JVM 體系結構與記憶體模型,如有不當之處,敬請指正。

JVM 擁有兩類類載入器:啟動類載入器與使用者自定義類載入器。類載入子系統依據類的全限定名(包含套件名、類名,網路載入時還包含 URL)將 Class 檔案載入運行時資料區。對於每個被載入的類型,JVM 都會在堆區建立一個 java.lang.Class 實例代表該類型,而類型資訊則儲存於方法區。
類載入過程嚴格遵循以下順序:
方法區儲存每個被類載入子系統載入的類型資訊,主要包含:
java.lang.Object 無父類)此外,還儲存以下資訊:
static 變數,因為被所有實例共享,屬於類層級)方法區也會被垃圾回收器回收。
所有執行緒共享一個堆,Java 程式運行時建立的所有類實例與陣列均放置於此。這正是多執行緒環境下物件存取同步問題的根源。不同 JVM 實作對堆中物件表示形式可能不同,但通常包含物件頭(類資訊指標、同步鎖等)與實例資料。

每個執行緒擁有獨立的 PC 暫存器,大小為一個字長,儲存下一條將執行的指令位址。
每個執行緒擁有一個 Java 棧,以棧幀為單位保存執行狀態。棧幀包含傳入參數、區域變數、中間運算結果等,方法完成時彈出並釋放。

支援 JNI(Java Native Interface),用於呼叫作業系統本地函式庫。
JVM 核心組件,負責載入並解析執行 Java 位元碼。每個執行緒都是一個獨立的執行引擎實例,生命週期內要么執行位元碼,要么執行本地方法。
連接本地方法棧與作業系統函式庫。
註:文中「Java 虛擬機」均指 Java EE 與 Java SE 平台的 JVM 規範。