A menudo escuché a los desarrolladores mencionar que Java no puede " hacer tiempo real ", lo que significa que una aplicación Java que se ejecuta en Linux no puede cumplir con los requisitos de un sistema determinista en tiempo real, como algo que se ejecuta en RIOT-OS, etc.
Estoy tratando de entender por qué . Mi SWAG me dice que esto probablemente se deba en gran parte al recolector de basura de Java, que puede ejecutarse en cualquier momento y pausar totalmente el sistema. Y aunque existen los llamados "GCs sin pausa", ¡no necesariamente creo en su publicidad, y tampoco tengo $ 80K por instancia de JVM para gastar en un proyecto de pasatiempo!
También estaba leyendo este artículo sobre la ejecución de software de drones en Linux . En ese artículo, el autor describe un escenario en el que Linux casi hace que su dron se estrelle contra su automóvil:
Aprendí una dura lección después de elegir hacer el bucle de control de bajo nivel (PID) en el Pi; tratando de ser inteligente, decidí poner un registro de escritura en el medio del bucle para la depuración: el quad inicialmente voló bien, pero luego Linux decidió tomar 2 segundos para escribir una entrada de registro y el quad casi se estrelló contra mi auto.
Ahora, aunque ese autor escribió su software de drones en C ++, me imagino que una aplicación Java que se ejecute en Linux podría sufrir el mismo destino.
De acuerdo con Wikipedia:
Se dice que un sistema es en tiempo real si la corrección total de una operación depende no solo de su corrección lógica, sino también del tiempo en que se realiza.
Entonces, para mí, esto significa " No tienes tiempo real si la corrección total requiere corrección lógica y puntualidad " .
Supongamos que he escrito una aplicación Java para que tenga un rendimiento excelente, y que he "exprimido el limón", por así decirlo, y que no podría escribirse razonablemente (en Java) para que sea más rápido.
En general, mi pregunta es: estoy buscando a alguien que me explique todas / la mayoría de las razones por las cuales una aplicación Java que ejecuta n Linux no podría ser una "aplicación en tiempo real". Es decir, ¿cuáles son todas las categorías de cosas en una pila Java / Linux que evitan que sea "puntual" y, por lo tanto, que sea " totalmente correcto "? Como se mencionó, parece que el vaciado de registros de GC y Linux puede pausar la ejecución, pero estoy seguro de que hay más cosas fuera de la aplicación Java que podrían causar un mal momento / rendimiento y hacer que cumpla con las estrictas limitaciones de la fecha límite. ¿Qué son?