{"id":4677,"date":"2023-08-25T17:54:34","date_gmt":"2023-08-25T15:54:34","guid":{"rendered":"https:\/\/www.tutego.de\/blog\/javainsel\/?p=4677"},"modified":"2023-08-25T17:54:34","modified_gmt":"2023-08-25T15:54:34","slug":"inselraus-echtzeit-java-real-time-java","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2023\/08\/inselraus-echtzeit-java-real-time-java\/","title":{"rendered":"Inselraus: Echtzeit-Java (Real-time Java)"},"content":{"rendered":"<p>Zwar laufen bei der Java\u00a0ME Programme auf Ger\u00e4ten mit reduziertem Speicher und eingeschr\u00e4nkter Prozessor-Leistungsf\u00e4higkeit, das sagt aber nichts \u00fcber die Reaktionsf\u00e4higkeit der Laufzeitumgebung auf externe Ereignisse aus. Wenn ein Sensor in der Sto\u00dfstange einen Aufprall meldet, darf die Laufzeitumgebung keine 20\u00a0ms in einer Speicheraufr\u00e4umaktion festh\u00e4ngen, bevor das Ereignis verarbeitet wird und der Airbag aufgeht. Um diese L\u00fccke zu schlie\u00dfen, wurde schon fr\u00fch \u2013 im Jahr 2001 \u2013 von der Java-Community die JSR 1, \u00bbReal-time Specification for Java\u00ab (kurz RTSJ), definiert (mittlerweile JSR 282 f\u00fcr den Nachfolger RTSJ 1.1.).<\/p>\n<p>Echtzeit-Anwendungen zeichnen sich dadurch aus, dass es eine maximale deterministische Wartezeit gibt, die das System zum Beispiel bei der automatischen Speicherbereinigung blockiert, um etwa auf \u00c4nderungen von Sensoren zu reagieren \u2013 ein Echtzeitsystem kann eine Antwortzeit garantieren, etwas, was eine normale virtuelle Maschine nicht kann. Denn nicht nur die Zeit f\u00fcr die automatische Speicherbereinigung ist bei normalen Laufzeitumgebungen eher unbestimmt, auch andere Aktionen unbestimmter Dauer kommen dazu: L\u00e4dt Java eine Klasse, dann zur Laufzeit. Das kann zu beliebig vielen weiteren Abh\u00e4ngigkeiten und Ladezyklen f\u00fchren. Bis also eine Methode ausgef\u00fchrt werden kann, k\u00f6nnen Hunderte von Klassendateien n\u00f6tig sein, und das Laden kann unbestimmt lange dauern.<\/p>\n<p>Mit Echtzeitf\u00e4higkeiten lassen sich auch Industrieanlagen mit Java steuern und l\u00e4sst sich Software aus dem Bereich Luft- und Raumfahrt, Medizin, Telekommunikation und Unterhaltungselektronik mit Java realisieren. Dieser Bereich blieb Java lange Zeit verschlossen und bildete eine Dom\u00e4ne von C(++). Damit dies in Java m\u00f6glich ist, m\u00fcssen JVM und Betriebssystem zusammenpassen. W\u00e4hrend eine herk\u00f6mmliche JVM auf mehr oder weniger jedem beliebigen Betriebssystem l\u00e4uft, sind die Anforderungen an Echtzeit-Java strenger. Das Fundament bildet immer ein Betriebssystem mit Echtzeitf\u00e4higkeiten (Real-Time Operating System (RTOS)), etwa Solaris 10, Realtime Linux, QNX, OS-9 oder VxWorks. Darauf setzt eine Echtzeit-JVM auf, eine Implementierung der Real-Time-Spezifikation. Real-time Java (RT-Java) unterscheidet sich daher auch in Details, etwa dass Speicherbereiche direkt belegt und freigegeben werden k\u00f6nnen (Scoped Memory), dass mehr Thread-Priorit\u00e4ten zur Verf\u00fcgung stehen oder dass das Scheduling deutlich mehr in der Hand der Entwickler liegt. Die Entwicklung ist anders, findet aber unter den bekannten Werkzeugen wie IDEs, Testtools und Bibliotheken statt. In den letzten Jahren ist es allerdings um Real-time Java ruhig geworden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zwar laufen bei der Java\u00a0ME Programme auf Ger\u00e4ten mit reduziertem Speicher und eingeschr\u00e4nkter Prozessor-Leistungsf\u00e4higkeit, das sagt aber nichts \u00fcber die Reaktionsf\u00e4higkeit der Laufzeitumgebung auf externe Ereignisse aus. Wenn ein Sensor in der Sto\u00dfstange einen Aufprall meldet, darf die Laufzeitumgebung keine 20\u00a0ms in einer Speicheraufr\u00e4umaktion festh\u00e4ngen, bevor das Ereignis verarbeitet wird und der Airbag aufgeht. Um [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1],"tags":[],"class_list":["post-4677","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4677","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=4677"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4677\/revisions"}],"predecessor-version":[{"id":4678,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4677\/revisions\/4678"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4677"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4677"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4677"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}