在投資銀行核心交易系統中,一次非預期的 2 秒 Full GC 可能導致數百萬美元損失。更致命的是,GC 往往發生在高負載尖峰期,系統對中斷最敏感之時。標準 J2SE/J2EE 許可協議明確禁止用於核電、防禦等關鍵任務系統——這正是即時 Java(Real-time Java,RTSJ)存在的意義。
「即時意味著能夠可靠、可預測地推測與控制程式邏輯的時間行為。」—— Greg Bollella,Sun 傑出工程師、RTSJ 規範作者
| 標準 Java 特性 | 即時需求衝突 | RTSJ 解決方案 |
|---|---|---|
| 非確定性 GC 停頓 | 無法保證最坏情況響應時間 | 確定性 GC(Henriksson GC)+ 非堆記憶體區域 |
| 執行緒優先級反轉 | 低優先級執行緒持有鎖阻塞高優先級 | 優先級繼承協議、28 級嚴格優先級 |
| 同步機制不可預測 | 鎖競爭導致非確定性阻塞 | 優先級天花板鎖、無鎖隊列 |
| 類載入/初始化非確定 | 首次使用觸發類初始化延遲 | 預先初始化、Immortal Memory 存放類元資料 |
| 高解析度時間缺失 | 毫秒級計時器精度不足 | 奈秒級 High-Resolution Timing API |
| 特性 | RealtimeThread | NoHeapRealtimeThread |
|---|---|---|
| 繼承體系 | extends Thread | extends RealtimeThread |
| 堆存取 | 可存取 Java 堆 | 禁止存取堆物件(含引用) |
| GC 干擾 | 可能被 GC 先佔 | 立即先佔任何 GC,零干擾 |
| 記憶體區域 | Heap/Immortal/Scoped | 僅 Immortal/Scoped |
| 優先級 | 28 級,嚴格優先級語義 | 28 級,嚴格優先級語義 |
| 優先級反轉 | 優先級繼承協議避免 | 優先級繼承協議避免 |
Thread.stop()Clock、Timer、PeriodicParameters 等排程原語RawMemoryAccess:位元組級實體記憶體讀寫,支援基本型別與陣列RawMemoryFloatAccess:浮點數存取擴充// 定義執行緒記憶體參數
MemoryParameters memParams = new MemoryParameters(
1024 * 1024, // 最大分配率:1MB/秒
10 * 1024 * 1024 // 最大記憶體區域消耗:10MB
);
// 建立非堆即時執行緒,綁定 ScopedMemory
ScopedMemory scope = new LTMemory(1024 * 1024); // 1MB 作用域
NoHeapRealtimeThread nhRtThread = new NoHeapRealtimeThread(
null, // SchedulingParameters 使用預設
null, // ReleaseParameters 使用預設
memParams,
scope,
null, // ProcessingGroupParameters
new Runnable() {
public void run() {
// 僅能分配 Immortal/Scoped 記憶體物件
// 此處編寫確定性邏輯
}
}
);
nhRtThread.start();
即時 Java 透過確定性 GC、非堆執行緒、分區記憶體、嚴格優先級排程、奈秒級時間、非同步事件等創新,將 Java 從「不可預測的企業級平台」昇華為「可證明確定性的任務關鍵平台」。對金融高頻交易、電信核心網、工業控制、國防航太等領域,RTSJ 不僅是技術選擇,更是合規必要。代價是開發複雜度提升、平均效能犧牲、需即時作業系統支援——但對真正需要確定性的系統,這是唯一可行之路。Java 有望成為首個商業可用的即時程式語言,這將重塑關鍵任務軟體開發版圖。