IBM JVM 5.0 推出革命性 共享類 技術:將系統類與應用類的 ROMClass (唯讀部分) 存儲於共享記憶體動態快取,多 JVM 進程可並行讀寫,大幅降低虛擬記憶體佔用並加速啟動。支援所有 IBM JVM 平台 (Windows/Linux/z/OS/AIX),甚至整合運行時位元碼修改 (JVMTI/自訂 ClassLoader)。本文深度解析架構原理、啟用參數、快取管理工具、效能實測、記憶體節省數據、Helper API 整合與安全性考量。
defineClass() 時)。無共享: 類載入器快取 → 父載入器 → 檔案系統
有共享: 類載入器快取 → 父載入器 → 共享快取 → 檔案系統
java.net.URLClassLoader 已整合共享支援,繼承者自動受益。自訂載入器需用 Helper API。| 參數 | 說明 | 預設值 | |
|---|---|---|---|
-Xshareclasses[:name=<cacheName>] | 啟用共享類,指定快取名稱 (唯一標識) | 預設名稱 (用戶級隔離) | |
-Xscmx<size>[k|m|g] | 快取大小上限 (僅建立新快取時生效) | 平台相關 (通常 16MB) | |
-Xshareclasses:modified=<context> | 支援運行時位元碼修改:指定上下文名稱隔離修改版類 | 無 (不支援修改版共享) |
| Helper | 適用場景 | 關鍵限制 |
|---|---|---|
SharedClassURLClasspathHelper | 擁有 URL 類路徑概念的載入器 | 類必須可經由類路徑 URL 存取;類路徑修改有限制 |
SharedClassURLHelper | 無類路徑概念,從任意 URL 載入 | 類必須可經由 URL 存取 |
SharedClassTokenHelper | 簡單鍵值存取,無檔案系統上下文 | 不支援動態更新 (無法偵測檔案變更) |
// 1. 載入前查找共享快取
byte[] findSharedClass(String className, ...); // 回傳字節碼 (特殊 cookie,不可修改)
→ defineClass(bytes)
// 2. 定義後存入共享快取
boolean storeSharedClass(Class clazz, ...); // 成功回傳 true
載入器被 GC 時,其 Helper 也隨之回收。完整 Javadoc 可從 IBM 開發者套件下載。
測試:掃描 jre/lib 所有 JAR,對每個類呼叫 Class.forName(),共載入 ~12,000 類。環境:單核 1.6GHz x86, Windows XP。
| 場景 | 耗時 | 備註 |
|---|---|---|
| 無共享 (磁盤快取預熱後) | ~4.2 秒 | 基準線 |
| 啟用共享 (冷快取,首次填充) | ~4.5 秒 | 略慢:寫入快取開銷 |
| 啟用共享 (熱快取,二次啟動) | ~1.1 秒 | 提速 74%,類載入時間大幅縮減 |

printStats 顯示快取 87% 滿,12,212 ROMClasses,45.5MB ROMClass 數據。
啟動 5 個測試實例:
| 模式 | 總提交虛擬記憶體 | 單實例平均 | 節省 |
|---|---|---|---|
| 無共享類 | 422 MB | 84.4 MB | 基準 |
| 啟用共享類 | 244 MB | 48.8 MB | 178 MB (42%) |

共享 ROMClass 數據 (~45MB) 僅佔 1 份實體記憶體,5 JVM 共用。提交記憶體 = JVM 基礎開銷 + 共享快取大小 (非線性疊加)。
groupAccess 開放主群組。SecurityManager 需顯式授予 SharedClassPermission。| 場景 | 啟動加速 | 記憶體節省 | 建議 |
|---|---|---|---|
| 大型應用服務器 (WebSphere, 多 WAR/EAR) | 極大 (數萬類) | 極大 (多 JVM 叢集) | 生產環境強烈建議啟用 |
| 微服務叢集 (多相同服務實例) | 大 | 大 | 容器化部署建議掛載共享快取卷 |
| HelloWorld / 小工具 | 微小 | 微小 | 可不啟用 |
| 頻繁重啟/動態部署環境 | 大 | 中 | 啟用並配合 expire 清理 |