垃圾回收(GC)是 Java 自動記憶體管理的基石,但其非決定性特徵對即時系統構成嚴重挑戰。本文剖析 GC 造成的不可預測延遲問題,並探討 RTSJ(Java 即時規範)提供的替代方案與 WebLogic 實時版(WLRT)的改良策略。
標準 JVM 的 GC 執行過程中會遍歷堆疊,識別不可達物件並回收。此過程佔用 CPU 週期,若發生在應用程式執行期間,會導致回應時間不可預測地延長。對於要求在確定、已知延遲下執行的即時應用,這種「延遲尖峰」是不可接受的。
雖能規避問題,但犧牲了 Java 的跨平台、生態豐富等核心優勢,非最佳選擇。
RTSJ 定義兩種繞過 GC 的記憶體區域:
代價: 記憶體管理負擔重回開發者肩上,類似 C/C++ 手動管理,易導致記憶體洩漏與崩潰,開發複雜度大增。
重新審視 GC:核心問題在於「不可預測的延遲尖峰」。若能限制最大延遲時間,GC 即變為可預測、可建模的任務。
WLRT 採用更高頻率的 GC 執行策略,將每次 GC 的工作量壓縮在極小範圍內,從而將最長停頓時間控制在已知閾值內。開發者可據此進行排程分析與系統建模,且完全保留了 Java 的易用性與自動記憶體管理優勢。
| 方案 | 確定性 | 開發易用性 | 適用場景 |
|---|---|---|---|
| 標準 GC | 低(不可預測) | 高 | 一般企業應用 |
| RTSJ (Immortal/Scoped) | 高(無 GC) | 低(手動管理) | 硬性即時、安全關鍵系統 |
| 約束式 GC (WLRT) | 高(可預測上限) | 高(保留自動 GC) | 軟性即時、即時 Java 應用 |
對於大多數尋求即時能力的 Java 專案,約束式 GC 提供了最佳平衡點:在不犧牲生產力的前提下,賦予系統可預測的時間行為。