為了實現 Java 應用程式之間的真正隔離,理論上需要啟動多個 JVM,但啟動成本高昂且記憶體佔用大,難以大規模應用。共享類技術應運而生:透過將核心系統類別載入共享記憶體區域,讓多個 JVM 共同使用,僅在首次使用時載入,後續 JVM 直接複用,大幅降低啟動時間與記憶體占用。本文深度剖析 IBM z/OS、Apple Mac OS X (JSA) 與 Sun J2SE 5.0 (CDS) 三大廠商的共享類技術實作細節與優缺點比較。

IBM 實作將記憶體劃分為兩部分:

採用標準的雙親委派模式。關鍵在於引入共享應用程式類別載入器,可將使用者/應用程式類別載入共享堆。類別物件若由 Bootstrap 載入器或共享類載入器定義,則建立於共享堆並標記為共享類別。


核心創新:建立全域命名空間作為跨 JVM 的類別快取。每個 JVM 的類別載入器需向命名空間註冊。當共享類載入器載入類別時,同時放入本地快取與命名空間(圖 5),其他已註冊 JVM 可直接從命名空間取得,無需重複載入。
| 挑戰 | 解決方案 |
|---|---|
| 保護域無法共享(含本地資訊) | 將 CodeSource 放入共享堆,打包資訊同步共享 |
| 多 JVM 並發讀寫共享資料的競爭條件 | 樂觀原子更新:載入前檢查命名空間,載入後驗證無衝突再更新 |
| 類別資訊的全域與本地部分分離 | 名稱等不變資訊共享;載入該類別的載入器等本地資訊各 JVM 保留副本(圖 6) |
| 靜態欄位修改的隔離性問題 | 每個 JVM 維護每個共享類別所有靜態欄位的獨立副本 |
| JIT 編譯代碼共享 | 自動共享:任一 JVM 編譯後,所有 JVM 受益,僅承擔一次編譯開銷 |
IBM 實作需要使用者以本地代碼編寫啟動器,控制 Master JVM 與 Worker JVM 的建立與銷毀流程(偽代碼參考原文清單 1)。
核心機制:JSA 本質是映射到共享記憶體的檔案,安裝 JRE 時由系統 JAR 建立,儲存核心類別的內部表示。資料為靜態只讀,永不改變,因此:
限制:僅限核心系統類別,不支援應用程式類別與 JIT 代碼共享。
基於 Apple JSA 技術,同樣使用唯讀記憶體映射檔案,啟動時映射到各 JVM 的 Java 堆。CDS 檔案可由 JRE 安裝程式建立或手動生成。
優勢:啟動成本大幅降低(一次映射所有核心類別,非逐個載入)、記憶體占用減少(共享唯讀類別資料)、避免處理未使用方法。
現狀限制:僅支援核心系統類別,未來規劃擴展至應用程式層級類別以改善大型應用啟動效能。
Java 共享類技術透過跨 JVM 共享核心類別,實現更快啟動與更低記憶體占用。三大廠商實作各有取捨:IBM 功能最完整(支援應用類與 JIT 代碼共享)但需自訂啟動器;Apple JSA 易用且持久但功能受限;Sun CDS 基於 JSA 整合進標準 JDK。隨著技術演進,打破應用層級類別共享限制將讓更多 Java 應用受益,提升 Java 平台整體吸引力。