Eu sempre ouvi os desenvolvedores mencionarem que o Java não pode " fazer em tempo real ", o que significa que um aplicativo Java em execução no Linux não pode atender aos requisitos de um sistema determinístico em tempo real, como algo em execução no RIOT-OS, etc.
Estou tentando entender o porquê . Meu SWAG me diz que isso provavelmente se deve principalmente ao Garbage Collector do Java, que pode ser executado a qualquer momento e pausar totalmente o sistema. E embora existam os chamados "GCs sem pausas" por aí, eu não acredito necessariamente na publicidade deles, e também não tenho uma instância de US $ 80 mil por JVM para gastar em um projeto de hobby!
Eu também estava lendo este artigo sobre a execução de software drone no Linux . Nesse artigo, o autor descreve um cenário em que o Linux quase fez com que seu drone colidisse com seu carro:
Aprendi uma lição difícil depois de escolher fazer o loop de controle de baixo nível (PIDs) no Pi - tentando ser inteligente, decidi colocar uma gravação de log no meio do loop para depuração - o quad inicialmente voou bem, mas o Linux decidiu levar 2 segundos para escrever uma entrada de log e o quadriciclo quase bateu no meu carro!
Agora, embora esse autor tenha escrito seu software drone em C ++, eu imaginaria que um aplicativo Java em execução no Linux poderia muito bem sofrer o mesmo destino.
De acordo com a Wikipedia:
Um sistema é considerado em tempo real se a correção total de uma operação depender não apenas de sua correção lógica, mas também do tempo em que é executada.
Então, para mim, isso significa " Você não tem tempo real se a correção total exigir correção lógica e pontualidade " .
Vamos fingir que escrevi um aplicativo Java para ter um desempenho excelente e que "apertei o limão" por assim dizer, e não podia ser razoavelmente escrito (em Java) para ser mais rápido.
Em suma, minha pergunta é: estou procurando alguém para me explicar todas / a maioria dos motivos pelos quais um aplicativo Java executando o Linux falharia em ser um "aplicativo em tempo real". Ou seja, quais são todas as categorias de coisas em uma pilha Java / Linux que impedem que "seja oportuna" e, portanto, " totalmente correta "? Como mencionado, parece que a liberação de log do GC e Linux pode pausar a execução, mas tenho certeza de que há mais coisas fora do próprio aplicativo Java que causariam mau tempo / desempenho e que atendam a restrições rígidas de prazo. O que eles são?