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

Java 共享類技術深度解析:IBM、Apple 與 Sun 三大實作比較

     編輯:Java 相關知識

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

一、IBM z/OS 實作:共享堆與命名空間機制

1.1 堆記憶體分解:共享堆與 Java 堆

共享類分解堆示意圖

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

  • 共享堆:由主 JVM 配置於共享記憶體,存放系統類別,生命週期隨主 JVM 存續,不受垃圾回收(GC)影響
  • Java 堆:每個 Worker JVM 獨立配置於非共享記憶體,存放應用專屬類別與所有實例化物件,受 GC 管理

1.2 類別載入器層次結構與共享類載入器

類別載入器層次結構

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

1.3 跨 JVM 共享機制:全域命名空間

無共享機制時各 JVM 獨立載入

跨 JVM 共享類別

核心創新:建立全域命名空間作為跨 JVM 的類別快取。每個 JVM 的類別載入器需向命名空間註冊。當共享類載入器載入類別時,同時放入本地快取與命名空間(圖 5),其他已註冊 JVM 可直接從命名空間取得,無需重複載入。

1.4 關鍵技術挑戰與解決方案

挑戰解決方案
保護域無法共享(含本地資訊)將 CodeSource 放入共享堆,打包資訊同步共享
多 JVM 並發讀寫共享資料的競爭條件樂觀原子更新:載入前檢查命名空間,載入後驗證無衝突再更新
類別資訊的全域與本地部分分離名稱等不變資訊共享;載入該類別的載入器等本地資訊各 JVM 保留副本(圖 6)
靜態欄位修改的隔離性問題每個 JVM 維護每個共享類別所有靜態欄位的獨立副本
JIT 編譯代碼共享自動共享:任一 JVM 編譯後,所有 JVM 受益,僅承擔一次編譯開銷

1.5 啟動器程式需求

IBM 實作需要使用者以本地代碼編寫啟動器,控制 Master JVM 與 Worker JVM 的建立與銷毀流程(偽代碼參考原文清單 1)。

二、Apple Mac OS X 實作:Java Shared Archive (JSA)

核心機制:JSA 本質是映射到共享記憶體的檔案,安裝 JRE 時由系統 JAR 建立,儲存核心類別的內部表示。資料為靜態只讀,永不改變,因此:

  • 無隔離性問題,類別永不被 GC 回收(引入 immortal 物件概念保護)
  • 無需特殊啟動器,預設啟用
  • 系統重啟後依然有效,不受單一 JVM 生命週期限制

限制:僅限核心系統類別,不支援應用程式類別與 JIT 代碼共享。

三、Sun J2SE 5.0 實作:Class Data Sharing (CDS)

基於 Apple JSA 技術,同樣使用唯讀記憶體映射檔案,啟動時映射到各 JVM 的 Java 堆。CDS 檔案可由 JRE 安裝程式建立或手動生成。

優勢:啟動成本大幅降低(一次映射所有核心類別,非逐個載入)、記憶體占用減少(共享唯讀類別資料)、避免處理未使用方法。

現狀限制:僅支援核心系統類別,未來規劃擴展至應用程式層級類別以改善大型應用啟動效能。

四、共享類技術的應用場景與未來展望

4.1 當前應用領域

  • 交易環境:CICS TS 2.3 on z/OS 利用共享類快取工具,擴展至 JVM 池(JVMset),共享系統類、中介軟體類與應用類,顯著降低類載入成本與總儲存需求(圖 7、圖 8)
  • 桌面系統:Mac OS X 與 Sun J2SE 5.0 使用者自動受益

4.2 未來潛在應用

  • 普及運算:PDA、行動裝置透過記憶體映射檔共享核心類,關鍵節省記憶體
  • 網格運算:優化資源利用率,降低單位成本,提升供應商競爭力
  • 大型 J2EE 應用:WebSphere 等載入數千類別的應用,共享核心與中介軟體類可大幅縮短啟動時間
  • 桌面應用:Eclipse、Swing/AWT 應用若啟動時核心類已載入,可顯著改善啟動緩慢與記憶體佔用大的痛點

五、結語

Java 共享類技術透過跨 JVM 共享核心類別,實現更快啟動與更低記憶體占用。三大廠商實作各有取捨:IBM 功能最完整(支援應用類與 JIT 代碼共享)但需自訂啟動器;Apple JSA 易用且持久但功能受限;Sun CDS 基於 JSA 整合進標準 JDK。隨著技術演進,打破應用層級類別共享限制將讓更多 Java 應用受益,提升 Java 平台整體吸引力。

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