Ho spesso sentito sviluppatori dire che Java non può " fare Tempo reale ", ovvero un'app Java in esecuzione su Linux non può soddisfare i requisiti di un sistema deterministico in tempo reale, come ad esempio qualcosa che viene eseguito su RIOT-OS, ecc.
Sto cercando di capire perché . Il mio SWAG mi dice che questo è probabilmente in gran parte dovuto a Garbage Collector di Java, che può essere eseguito in qualsiasi momento e totalmente sospeso il sistema. E anche se ci sono i cosiddetti "GC pauseless" là fuori, non credo necessariamente alla loro pubblicità, e inoltre non ho $ 80K-per-JVM-istanza da affidare a un progetto per hobby!
Leggevo anche questo articolo sull'esecuzione di software drone su Linux . In questo articolo, l'autore descrive uno scenario in cui Linux ha quasi fatto precipitare il suo drone nella sua auto:
I learnt a hard lesson after choosing to do the low level control loop (PIDs) on the Pi - trying to be clever I decided to put a log write in the middle of the loop for debugging - the quad initially flied fine but then Linux decided to take 2seconds to write one log entry and the quad almost crashed into my car!
Ora, anche se quell'autore ha scritto il suo software drone in C ++, immagino che un'app Java in esecuzione su Linux possa benissimo subire lo stesso destino.
Secondo Wikipedia:
A system is said to be real-time if the total correctness of an operation depends not only upon its logical correctness, but also upon the time in which it is performed.
Quindi per me, questo significa " Non hai tempo reale se la correttezza totale richiede correttezza e tempestività logica. "
Facciamo finta di aver scritto un'app Java per essere super performante, e che ho "spremuto il limone" per così dire, e non si può ragionevolmente scrivere (in Java) per essere più veloce.
Tutto sommato, la mia domanda è: sto cercando qualcuno che mi spieghi tutti / molti dei motivi per cui un'app Java che esegue n Linux non sarebbe una "app in tempo reale". Significato, quali sono tutte le categorie di cose su uno stack Java / Linux che impediscono di "essere tempestivo" e, quindi, di essere " completamente corretto "? come accennato , sembra che il log-flushing di GC e Linux possa sospendere l'esecuzione, ma sono sicuro che ci sono più cose al di fuori della stessa app Java che causerebbero un cattivo timing / prestazioni e far sì che rispetti i vincoli di scadenza. Che cosa sono?