Я часто слышал, как разработчики упоминали, что Java не может « делать в реальном времени », то есть приложение Java, работающее в Linux, не может отвечать требованиям детерминированной системы реального времени, такой как что-то, работающее в RIOT-OS и т. Д.
Я пытаюсь понять, почему . Моя SWAG говорит мне, что это, вероятно, во многом благодаря сборщику мусора Java, который может работать в любое время и полностью останавливать систему. И хотя существуют так называемые «бессмысленные сборщики мусора», я не обязательно верю их рекламе, а также не имею $ 80K за JVM-экземпляр, который можно раскошелиться на хобби-проект!
Я также читал эту статью о запуске программного обеспечения дронов в Linux . В этой статье автор описывает сценарий, когда Linux чуть не врезался в его дрон:
Я усвоил тяжелый урок после того, как решил сделать цикл управления низкого уровня (PID) на Pi - пытаясь быть умным, я решил поместить запись журнала в середину цикла для отладки - квадроцикл изначально работал нормально, но затем Linux решил заняло 2 секунды, чтобы написать одну запись в журнале, и квад почти врезался в мою машину!
Теперь, хотя этот автор написал свое программное обеспечение для дронов на C ++, я бы предположил, что Java-приложение, работающее на Linux, вполне может постигнуть та же участь.
Согласно Википедии:
О системе говорят, что она работает в режиме реального времени, если полная корректность операции зависит не только от ее логической правильности, но также и от времени, в которое она выполняется.
Так что для меня это означает: « У вас нет реального времени, если полная корректность требует логической корректности и своевременности ».
Давайте представим, что я написал Java-приложение для супер производительности, и что я «сжал лимон», так сказать, и его нельзя было написать (на Java), чтобы быть быстрее.
В общем, мой вопрос: я ищу кого-то, кто объяснит мне все / большинство причин, почему приложение Java, работающее под Linux, не может быть «приложением реального времени». Имеется в виду, что все категории вещей в стеке Java / Linux препятствуют тому, чтобы он был «своевременным» и, следовательно, « абсолютно правильным »? Как уже упоминалось, похоже, что очистка журналов в GC и Linux может приостановить выполнение, но я уверен, что помимо самого приложения Java есть и другие вещи, которые могут привести к плохой синхронизации / производительности и привести к жестким ограничениям сроков. Кто они такие?