即時 Java 是對 Java 語言的一組增強,為應用程式提供了一定程度的即時效能,這些即時效能是標準 Java 技術所不能提供的。傳統的輸送量效能通常是對可在固定時間量內完成的指令、任務或工作的總數的衡量。與傳統的輸送量效能不同,即時效能專註於應用程式(在不超出給定時間約束的情況下)響應外部刺激因素所需的時間。在硬 即時系統中,決不能超出這類約束;軟 即時系統對違規具有更高的容忍度。即時效能要求應用程式本身控制處理器,以便它能夠響應刺激因素,並且在響應刺激因素的同時,虛擬機器內的競爭進程不會阻止應用程式代碼的執行。即時 Java 在 Java 應用程式中交付了前所未有的響應能力。
即時 JVM 可利用即時作業系統(real-time operating system,RTOS)服務來提供硬即時功能,或者可以為具有比較軟的即時約束的應用程式運行一個或多個傳統作業系統。在使用即時 JVM 時,可以免費使用即時 Java 中使用的一些技術。但是為了探索即時 Java 中的一些特性,需要對應用程式進行一些更改。這些特性是本文介紹的重點。
必須約束的子進程
JVM 服務是一個執行工作的給定應用程式,這些工作僅能被該應用程式鬆散地控制。一些運行時子進程在 JVM 內部運行,包括:
垃圾收集:此任務用於收回應用程式不再使用的運行時記憶體塊。垃圾收集可以使應用程式執行延遲一段時間。
類載入:此進程(之所以稱為類載入,是因為 Java 應用程式是在類粒度層級載入的)涉及從檔案系統或網路載入應用程式結構、指令和其他資源。在標準 Java 中,應用程式在第一次引用一個類時載入這個類(延遲 載入)。
即時(Just-in-time,JIT)動態編譯:許多虛擬機器在應用程式運行時通過動態編譯將方法由 Java 位元組碼解釋為本地機器指令。儘管這可以提高效能,但編譯活動本身可能導致臨時延遲,阻止應用程式代碼運行。
調度:在標準 Java 中,應用程式只有極小的控制許可權來調度自己的運行線程,以及調度與在同一作業系統上啟動並執行其他應用程式相關的應用程式。
所有這些子進程都可能限制應用程式響應外部刺激因素的能力,因為它們可能延遲應用程式代碼的執行。例如,可以調度一個指令序列來響應來自網路、雷達系統、鍵盤或任何其他裝置的訊號。即時應用程式具有一段很短的可接受時期,在此期間,允許不相關的進程(比如垃圾收集)延遲響應指令序列的執行。
即時 Java 提供了各種技術,旨在最小化底層子進程對應用程式的幹擾。切換到即時 JVM 時可使用的 “免費” 技術包括:限制了收集操作的期間和幹擾影響的專門垃圾收集,允許在啟動時最佳化效能(而不是延遲最佳化)的專門的類載入,專門的鎖定和同步,以及能夠避免優先順序反轉的專門的優先線程調度。但是,可能需要對應用程式進行一些修改,要利用 Java 即時規範(Real-Time Specification for Java,RTSJ)引入的特性時更應如此。
RTSJ 提供了一個支援 JVM 中大量即時特性的 API。一些特性在規範實現中是強制性的,另一些是可選的。規範包括以下一般地區:
即時調度
進階記憶體管理
高精度計時器
非同步事件處理
非同步線程中斷
Realtime 線程
RTSJ 定義了 javax.realtime.RealtimeThread — 標準 java.lang.Thread 類的一個子類。從本質上講,RealtimeThread 支援規範中的一些進階特性。例如,即時線程受即時線程調度器控制。該調度器提供了一個獨特的調度優先順序範圍,可以實現先入先出的即時調度策略(確保最高優先順序的線程不會受到幹擾),以及優先順序繼承(該演算法可阻止較低優先順序線程無限期地持有需要不受幹擾地啟動並執行較高優先順序線程所需的鎖,這種情形稱為優先順序反轉)。
可以在代碼中明確構造 RealtimeThread 的執行個體。但是也可以輕鬆更改應用程式來啟用即時線程,從而避免繁重的開發工作和相關成本。這裡給出了幹擾最小且最透明地啟用即時線程的各種方式的樣本。這些技術使應用程式能夠最輕鬆地利用即時線程,使應用程式能夠保持與標準虛擬機器相容。