Auf meinen Fahrten von und zur Arbeit schweife ich hin und wieder gedanklich ein wenig ab. Hier das Ergebnis meiner jüngsten Gedankenexpedition...
Als ich vor inzwischen vielen Jahren in einem Projekt mit VxWorks arbeiten durfte funktionierte alles toll - bis zum ersten Langzeitversuch: Die Analyse der Messwerte dauerte immer länger bis sich die Analysedauer irgendwann asymptotisch einem Höchstwert annäherte.
Das geschah über mehrere Tage hinweg - der Anstieg geschah also sehr langsam, dennoch war das Erreichen der Asymptote bereits zu einem Zeitpunkt erreicht, der weit unterhalb der geplanten durchschnittlichen Missionsdauer lag. Die für die Analyse benötigte Maximalzeit (der asymptotisch erreichte Wert) lag deutlich über dem in der Systemspezifikation vorgegebenen.
Wir mussten also Änderungen vornehmen und dafür mussten wir herausfinden, wo?
Nach längeren Untersuchungen erkannten wir, dass die Speicherverwaltung für unser Board Support Package als einfach verkettete Liste implementiert war und der Speicher während der Laufzeit mehr und mehr fragmentiert wurde - damit wurde die Zeit zum Finden eines passenden Speicherblocks natürlich immer länger, was sich letztlich auf die Analysedauer niederschlug.
Wir waren über diese Diagnose extrem überrascht, denn wir waren eigentlich der Meinung, dass wir dem Leitsatz harter Echtzeitanforderungen gefolgt waren: Beim Start des Systems wird einmal der Arbeitsspeicher aufgeteilt und allokiert, danach startet die eigentliche Arbeit und währenddessen ist Speicher allokieren oder frei geben des Teufels.
Dies wurde durch intensive und gründliche Codereviews sichergestellt - aber woher kam die Fragmentierung und das ständige neu Allokieren? Letztlich fanden wir, dass die STD-Library verantwortlich war: Wir nutzen verkettete Listen und einige andere Datenstrukturen der STDLib und diese benutzen ihr eigenes Speichermanagement, das fröhlich dynamisches Speichermanagement betrieb. NAchdem wir diese wieder ausgebaut hatten (eine undankbare Aufgabe!) war das Performanceproblem gelöst.
Daraufhin kam mir der Gedanke, ob dieses Paradigma: Am Anfang allokieren und dann nur noch mit bestehenden Speicherbereichen (Objekten) interagieren auch in Java möglich wäre?
Es existieren ja bereits diverse Object-Caches, auch ich habe solche für Threads mit Erfolg erstellt und eingesetzt. Weitere übliche Verdächtige sind Connection-Pools für die Kommunikation mit Datenbanken.
Aber funktioniert das für alle (irgendwelche) Objekte? folgende Überlegungen dazu:
Als jemand, der da nicht so genau drinsteckt, würde mich interessieren, ob es bei den funktionalen Sprachen, die es für die JVM gibt, einen speziellen Garbage-Collector-Modus gibt. Ich kann mich nämlich noch sehr genau erinnern was passiert ist, als ich eine eigene Softwarelösung zur Visualisierung dreidimensionaler Daten schaffen wollte: Bei jeder mathematischen Operation mit 3D-Vektoren wurde ein neues Objekt erzeugt, das das Ergebnis enthielt. Bei der 3D-Visualisierung sind unheimlich viele solcher mathematischen Operationen durchzuführen. Die JVM überwacht das Verhältnis der Zeit, die im Garbage Collector verbracht wird zu der Zeit, die die Laufzeitumgebung mit der Abarbeitung des eigentlichen Programmes zubringt. Wird dieses zu ungünstig , wird das Programm mit einer Exception beendet.
Daher würde mich wirklich interessieren, ob funktionale JVM-Sprachen dieses Problem gelöst haben oder aber nur ganz spezielle Algorithmen damit umgesetzt werden können - eben solche, die nicht zu viel tun (und damit die Erzeugung neuer Objekte minimieren). Das ist schon fast ein Anreiz, mich doch noch einmal mit funktionaler Programmierung uz befassen...
13.01.2019
Angefangen hat alles mit der Information, dass ein Meetup hier in der Nähe zum Thema "Java upside down: funktionale Programmierung in Java mit Vavr"
24.11.2018
Das letzte Mal, als ich über Vor- und Nachteile der Durchführung mathematischer Berechnungen mit verschiedenen Datentypen schrieb, vernachlässigte ich einen Aspekt, dessen Einfluss und Wichtigkeit von der benutzten Programmiersprache und konkreten Implementierung abhängt:
Multi-User-WebDAV, Docker, GitHub
17.11.2019
Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...
Weiterlesen...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Jupyter Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
In eigener Sache...
Weiterlesen...Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.
Weiterlesen...Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.
Weiterlesen...Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.
Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.
Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...
PS: Meine öffentlichen Codeberg-Repositories findet man hier.