За исключением сборщика мусора, что еще делает Java языком программирования не в реальном времени

28

Кроме сборщика мусора, какие еще функции в Java делают его неподходящим для программирования в реальном времени? В сети всякий раз, когда Java против C ++ обсуждается в отношении программирования в реальном времени, всегда упоминается сборщик мусора. Есть ли еще что-нибудь?

Кошик
источник
4
Даже сборка мусора не является проблемой - есть несколько жестких сборщиков мусора в реальном времени. Те, кто упоминает gc как ограничитель показа в реальном времени, просто некомпетентны.
SK-logic
2
@ SK-логика s / некомпетентный / неосведомленный / г
Скотт Уитлок
@ ScottWhitlock, согласился, большинство из них. Но некоторые (самые громкие) продолжают настаивать даже после того, как их должным образом информируют. Я не знаю ни одного рационального объяснения этого антропологического явления.
SK-logic

Ответы:

36

Есть два дополнительных пункта, которые я могу вспомнить по отдельности:

  1. JIT сборник
  2. Реализация потоков

В реальном времени предсказуемость производительности, вероятно, является наиболее важным фактором; Вот почему непредсказуемый цикл GC делает Java непригодной для работы в реальном времени.

JIT предлагает улучшенную производительность, но запускается в какой-то момент после запуска программы, использования некоторых ресурсов и изменения скоростей выполнения системы. Это также может произойти снова на более позднем этапе, если виртуальная машина полагает, что она может сделать «лучшую» работу в это время.

Что касается многопоточности: на данный момент я не совсем помню, является ли это частью языкового дизайна или просто очень распространенной реализацией, но Java обычно не предоставляет инструментов для точного управления выполнением потоков; Например, хотя для потоков указано 10 «приоритетов», не требуется, чтобы виртуальная машина действительно учитывала эти приоритеты. Операторы остановки и переключения потоков также либо не определены, либо жестко не соблюдаются системой.

Существует несколько реализаций JSR 1: Спецификация в реальном времени для Java - спецификация, которая была одобрена в 1998 году. Эта спецификация затрагивает как можно больше проблем, которые делают стандартную Java непригодной для работы в реальном времени.

Примерно 5 лет назад у Sun (теперь Oracle) была RTSJ VM (у которой никогда не было имени, AFAIK); У IBM был WebSphere Real Time; И JamaicaVM было бесплатным (?), Независимым от платформы решением. Погуглить тех сегодня мало что дает.

авив
источник
Другая проблема, хотя и небольшая по сравнению, заключается в том, что класс загружается только тогда, когда он будет использоваться.
T-Bull
5
В спецификации Java нет ничего, что обеспечивало бы использование JIT вместо AOT или чистой интерпретации. Чистые зеленые нити абсолютно предсказуемы, поэтому они также не могут быть препятствием в реальном времени.
SK-logic
По-видимому, поддержка реального времени в websphere по-прежнему поддерживается (заявляется о поддержке Java 7.0, и вы можете перейти на страницу, чтобы приобрести ее)
jk.
@ СК-логика - правильно, хорошо!
Авив
33

Операционная система

Пока Java работает поверх Unix или Windows или любой другой «обычной» ОС, реальное время не гарантируется.

ОС реального времени обязательна для запуска приложений реального времени.

mouviciel
источник
13
@ Джорджио: для твердых гарантий в реальном времени? Да.
Иоахим Зауэр
5
Кроме того, существуют доступные операционные системы, разработанные для реального времени с самого начала, например, FreeRTOS.
Медив
4
Хотя это очень важный момент для сложного реального времени в целом, он, по-видимому, не является специфичным для Java. Я что-то пропустил?
3
@delnan суть в том, что даже если вы используете (воображаемую?) реализацию Java VM в реальном времени, это не сильно поможет, если ОС не может дать вам гарантии в реальном времени.
Шлингель
3
@delnan - у вопроса есть ложные предпосылки, предполагающие, что C ++ является языком программирования в реальном времени.
Mouviciel
7

Технически возможно иметь Java в реальном времени (как подсказывают комментарии SK-logic). однако это не распространено по ряду нетехнических причин:

Старые стандарты

Возникли проблемы с поиском ссылки на это, но я уверен, что я видел стандарты безопасности или советы по соответствию стандартам безопасности, наложил полный запрет на Java. Правильно или нет, если вам нужно соответствовать чему-то, что говорит, что Java - верботен, то Java - верботен.

Старые инженеры по технике безопасности

Даже если вам нужно работать над стандартами, чтобы не запрещать Java, работа с аудиторами Safety / Quality без опыта работы с Java будет означать, что вы не идете по пути наименьшего сопротивления. Все, что является необычным для аудитора, вероятно, вызовет много вопросов, что, в свою очередь, означает большую работу для вас, оправдывающую ваш выбор.

Общество

т. е. существует много зависимостей от пути, большинство нынешних экспертов в реальном времени будут знать C ++, C или ADA наизнанку, поэтому это естественный выбор для новой работы.

(примечание: я несколько совмещал в реальном времени и безопасность в вышеупомянутом, что является своего рода другой проблемой, в которой даже стандарты безопасности часто объединяют два)

JK.
источник