Abgesehen vom Garbage Collector ist Java eine andere Programmiersprache als Echtzeit

28

Mit Ausnahme des Garbage Collectors: Welche anderen Funktionen in Java sind für die Echtzeitprogrammierung ungeeignet? Im Internet wird immer dann, wenn Java gegen C ++ in Bezug auf die Echtzeitprogrammierung diskutiert wird, der Garbage Collector erwähnt. Gibt es noch etwas?

Kaushik
quelle
4
Sogar die Müllabfuhr ist kein Problem - es stehen mehrere Echtzeit-Müllabfuhrsysteme zur Verfügung. Diejenigen, die gc als Show Stopper für Echtzeit erwähnen, sind einfach inkompetent.
SK-logic
2
@ SK-logic s / inkompetent / nicht informiert / g
Scott Whitlock
@ ScottWhitlock, einverstanden, die meisten von ihnen sind. Aber einige (die lautstärksten) bestehen darauf, selbst nachdem sie richtig informiert wurden. Mir ist keine rationale Erklärung für dieses anthropologische Phänomen bekannt.
SK-logic

Antworten:

36

Es gibt zwei zusätzliche Dinge, an die ich mich sofort erinnern kann:

  1. JIT-Zusammenstellung
  2. Threading-Implementierung

In Echtzeit ist die Vorhersagbarkeit der Leistung wahrscheinlich der wichtigste Faktor. Aus diesem Grund ist Java aufgrund eines unvorhersehbaren GC-Zyklus nicht für Echtzeit geeignet.

JIT bietet eine verbesserte Leistung, wird jedoch zu einem bestimmten Zeitpunkt nach der Ausführung des Programms aktiviert, beansprucht einige Ressourcen und ändert die Ausführungsgeschwindigkeit des Systems. Es kann auch zu einem späteren Zeitpunkt wieder vorkommen, wenn die VM glaubt, dass sie zu diesem Zeitpunkt einen "besseren" Job machen kann.

Zum Thema Threading: Ich kann mich noch nicht genau erinnern, ob dies Teil des Sprachentwurfs oder nur eine sehr häufige Implementierung ist, aber Java bietet normalerweise keine Tools zur präzisen Steuerung der Thread-Ausführung. Während beispielsweise 10 "Prioritäten" für Threads angegeben sind, muss die VM diese Prioritäten nicht berücksichtigen. Operatoren zum Stoppen und Wechseln von Threads sind ebenfalls entweder nicht definiert oder werden vom System nicht starr eingehalten.

Es gibt verschiedene Implementierungen von JSR 1: Echtzeitspezifikation für Java - eine Spezifikation, die 1998 genehmigt wurde. Diese Spezifikation behebt so weit wie möglich die Probleme, die Standard-Java für Echtzeit ungeeignet machen.

Vor vielleicht 5 Jahren hatte Sun (Now Oracle) eine RTSJ-VM (That never had a name, AFAIK). IBM hatte WebSphere Real Time; Und JamaicaVM war eine kostenlose (?), Plattformunabhängige Lösung. Wer heute googelt, bringt nicht viel.

aviv
quelle
Ein weiteres, wenn auch im Vergleich kleines Problem ist, dass eine Klasse nur geladen wird, wenn sie verwendet werden soll.
T-Bull
5
In der Java-Spezifikation gibt es nichts, was JIT anstelle von AOT oder einer reinen Interpretation erzwingen würde. Reine grüne Fäden sind absolut vorhersehbar, daher können sie auch kein Echtzeithindernis sein.
SK-logic
websphere real time scheint zumindest noch unterstützt zu sein (behauptet, Java 7.0 unterstützt und Sie können eine Seite aufrufen, um es zu kaufen)
jk.
@ SK-Logik - Richtig, guter Punkt!
Aviv
33

Das Betriebssystem

Solange Java auf Unix oder Windows oder einem anderen "normalen" Betriebssystem ausgeführt wird, kann keine Echtzeit garantiert werden.

Ein Echtzeitbetriebssystem ist für die Ausführung von Echtzeitanwendungen obligatorisch.

mouviciel
quelle
13
@Giorgio: Für harte Echtzeitgarantien? Ja.
Joachim Sauer
5
Zusätzlich stehen Betriebssysteme zur Verfügung, die von Anfang an für Echtzeit ausgelegt sind, z. B. FreeRTOS.
medivh
4
Während dies ein sehr wichtiger Punkt für harte Echtzeit im Allgemeinen ist, scheint es nicht im geringsten Java-spezifisch zu sein. Vermisse ich etwas?
3
@delnan der Punkt ist, auch wenn Sie eine (imaginäre?) Echtzeitimplementierung einer Java-VM verwenden, hilft es nicht viel, wenn das Betriebssystem Ihnen keine Echtzeitgarantien geben kann.
Schlingel
3
@delnan - Die Frage hat falsche Voraussetzungen, was darauf hindeutet, dass C ++ eine Echtzeit-Programmiersprache ist.
Mouviciel
7

Technisch ist es möglich, Java in Echtzeit zu haben (wie aus den Kommentaren von SK-logic hervorgeht). Es ist jedoch aus einer Reihe von nicht technischen Gründen nicht üblich:

Alte Standards

Ich habe Probleme, eine Referenz dafür zu finden, aber ich bin sicher, dass ich Sicherheitsstandards oder Ratschläge zur Konformität mit Sicherheitsstandards gesehen habe, die Java pauschal verbieten. Zu Recht oder zu Unrecht, wenn Sie sich an etwas halten müssen, das sagt, dass Java verboten ist, dann ist Java Verboten.

Alte Sicherheitsingenieure

Selbst wenn die Standards, nach denen Sie arbeiten müssen, um Java nicht zu verbieten, die Arbeit mit Sicherheits- / Qualitätsprüfern ohne Java-Erfahrung bedeuten, dass Sie nicht den Weg des geringsten Widerstands beschreiten. Alles, was für den Prüfer ungewöhnlich ist, wird wahrscheinlich viele Fragen aufwerfen, was wiederum eine Menge Arbeit für Sie bedeutet, um Ihre Entscheidungen zu rechtfertigen.

Die Gemeinde

Das heißt, es besteht eine große Pfadabhängigkeit. Die meisten aktuellen Echtzeitexperten kennen C ++, C oder ADA in- und auswendig, sodass es eine natürliche Wahl ist, neue Aufgaben zu erledigen.

(Anmerkung: Ich habe Echtzeit und Sicherheit in den obigen Punkten in gewisser Weise in Konflikt gebracht, was ein weiteres Problem darstellt, da selbst Sicherheitsstandards häufig die beiden Aspekte in Konflikt bringen.)

jk.
quelle