Ci sono altri due elementi che posso ricordare a memoria:
- Compilare JIT
- Implementazione di threading
In termini di tempo reale, la prevedibilità delle prestazioni è probabilmente il fattore più importante; Ecco perché un ciclo di GC imprevedibile rende Java non adatto alla realtà.
JIT offre prestazioni migliorate, ma prende il via ad un certo punto dopo che il programma è in esecuzione, prendendo alcune risorse e modificando le velocità di esecuzione del sistema. Può anche accadere di nuovo in una fase successiva, se la VM crede di poter fare un lavoro "migliore" in quel momento.
Per quanto riguarda il threading: non ricordo a questo punto se questo fa parte del design del linguaggio, o solo un'implementazione molto comune, ma in genere Java non fornisce strumenti per controllare con precisione l'esecuzione del thread; Ad esempio, mentre ci sono 10 "priorità" specificate per i thread, non è necessario che la VM consideri effettivamente queste priorità. Anche gli operatori per l'arresto e la commutazione dei thread non sono definiti o non sono rigidamente rispettati dal sistema.
Esistono diverse implementazioni di JSR 1: Specifiche in tempo reale per Java - una specifica che ha stato approvato nel 1998.
Questa specifica risolve il più possibile i problemi che rendono Java standard inadatto alla realtà in tempo reale.
A partire da circa 5 anni fa, Sun (ora Oracle) aveva una macchina virtuale RTSJ (che non ha mai avuto un nome, AFAIK); IBM aveva WebSphere Real Time; E JamaicaVM era una soluzione gratuita (?), Indipendente dalla piattaforma. Googling quelli oggi non porta molto.