Bei einigen unserer Kunden, die ein Upgrade auf Notes 11 durchgeführt haben, sind im Notes-Client Speicherplatzprobleme aufgetreten.

Manchmal war es eine Meldung, die besagte, dass nicht genügend freier Speicher vorhanden ist, manchmal war es ein Hänger mit Fehlern im Trace-Protokoll. Das Problem trat in der Regel auf, nachdem der Client eine Weile geöffnet war, und zwar häufig beim Öffnen von MIME-E-Mails, die aus dem Internet gesendet wurden, oder beim Klicken auf Links zum Öffnen eines externen Browsers. Wenn die Benutzer bei Sametime angemeldet waren, war es wahrscheinlicher, dass dies geschah.

Das Seltsame an der Sache ist:

  • Der Computer verfügte über reichlich freien Speicher und
  • Der Task-Manager zeigte an, dass Notes eine normale Menge an Arbeitsspeicher verwendet, vielleicht 250 MB oder so.

Was zum Teufel war da los, und was können wir tun, um das Problem zu lösen?

Verschiedene Arten von Erinnerungen

Der erste Hinweis ist, dass der Task-Manager nur den Arbeitsspeicher für eine Anwendung anzeigt: im Wesentlichen die Menge des verwendeten Speichers. Diese Zahl ist gut zu wissen und in den meisten Fällen auch wichtig, aber es gibt noch andere Möglichkeiten, wie Ihnen der Speicher ausgehen kann. Wir haben den Windows-Leistungsmonitor geöffnet, um einen genaueren Blick darauf zu werfen.

Performance Monitor verfügt über einen Abschnitt Prozesse mit zusätzlichen Speichermessungen, die Sie verfolgen können. Insbesondere haben wir uns die „Private Bytes“ (die Menge an gebundenem Speicher, die die Anwendung verwendet) und die „Virtual Bytes“ (die Menge an virtuellem Adressraum, den die Anwendung reserviert hat) angesehen. Hier sehen Sie einen Screenshot von Performance Monitor und Task Manager nebeneinander, während der Notes-Client läuft:

Sie sehen, dass der Task-Manager 215 MB belegten Arbeitsspeicher anzeigt, während der Performance Monitor uns sagt, dass fast 2 GB virtueller Adressraum reserviert sind. Bei unseren Tests stellten wir fest, dass Fehler wegen Speichermangels an dem Punkt auftraten, an dem der Client die 2-GB-Marke in der Überwachung des virtuellen Adressraums erreichte.

Diese 2GB-Marke ist wichtig, weil der Notes-Client immer noch eine 32-Bit-Anwendung ist. Einer der Nebeneffekte davon ist, dass er nur 2 GB virtuellen Adressraum zur Verfügung hat (eigentlich 4 GB, aber die Hälfte davon wird vom Kernel beansprucht). 64-Bit-Anwendungen haben einen viel, viel größeren virtuellen Adressraum (sie reservieren manchmal Terabytes an Speicherplatz), aber 32-Bit-Anwendungen müssen vorsichtig sein.

SIDEBAR: Ein paar Klarstellungen zum virtuellen Adressraum:

  • es ist etwas völlig anderes als virtueller Speicher
  • es sagt Ihnen nicht, wie viel Speicher die Anwendung tatsächlich verbraucht
  • es hat nichts damit zu tun, wie viel Speicherplatz auf dem Computer vorhanden ist
  • es ist eine Möglichkeit, den Speicher zuzuordnen, der von der Anwendung verwendet werden könnte

Darüber hinaus ist es schwer zu erklären, und den meisten Leuten ist es egal, aber wenn Sie daran interessiert sind, finden Sie hier eine schöne Zusammenfassung: https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/virtual-address-spaces

Aber warum verbraucht es so viel und wie können wir das Problem beheben, wenn wir wissen, was wir wissen?

Verringern der Java Heap-Größe

Spoiler-Alarm: Die unmittelbare Lösung bestand darin, die Größe des vom Notes-Client verwendeten Java-Heaps zu reduzieren. Dies scheint kontraintuitiv zu sein – normalerweise wollen Sie bei einem Fehler, bei dem der Speicher nicht ausreicht, den Speicher vergrößern – aber lesen Sie weiter.

Die Java-Heap-Größe für den Client wird über einen Parameter in der Datei jvm.properties im Verzeichnis Notes/framework/rcp/deploy gesteuert. Sie hat einen Eintrag wie diesen:

vmarg.Xmx=-Xmx512m

Dies steuert die maximale Größe des Java-Heaps, d.h. die Menge an Speicher, die Java (und in diesem Fall der Notes-Client) für die Ausführung von Code verwendet. Der Standardwert für Notes ist 512MB, wie im obigen Parameter angegeben. Viele Kunden möchten diesen Wert jedoch erhöhen, wenn sie speicherintensive Dinge mit ihren Notes-Clients tun, insbesondere wenn sie Domino Designer verwenden.

Dies ist ein relativ häufig verwendeter Parameter, den Sie anpassen können. Es gibt sogar einen Technischen Hinweis dazu .

Unsere Kunden, die Fehler wegen fehlendem Speicherplatz bekamen, hatten diesen Parameter auf 1024MB eingestellt. Unter Notes 9 war dies nie ein Problem, aber unter Notes 11 war es plötzlich zu viel Speicher, der dem Heap zugewiesen werden musste.

Indem ich den Wert auf Xmx512m reduzierte, verschwanden die „Out of Memory“-Fehler.

Außerdem konnten wir mit dem Performance Monitor feststellen, dass der virtuelle Adressraum durch die Verwendung eines 512 MB großen Heaps auf etwa 1,5 GB reduziert wurde, so dass der Client viel mehr Spielraum hatte, wenn er zusätzliche Speicherplätze reservieren musste.

Warum war das früher kein Problem?

Die nächste naheliegende Frage lautet: Warum hatten die Kunden dieses Problem nicht mit dem Notes 9-Client?

Wenn Sie eine 32-Bit-Anwendung kompilieren, können Sie ein Flag namens /LARGEADDRESSAWARE setzen. Dadurch kann der Prozess der Anwendung auf einem 64-Bit-Betriebssystem die vollen 4 GB virtuellen Adressraum nutzen, anstatt der 2 GB, die wir oben gesehen haben.

Es stellte sich heraus, dass die Dateien java.exe und notes2.exe auf dem Notes 9-Client mit den Flags /LARGEADDRESSAWARE kompiliert wurden, die Dateien java.exe und notes2.exe auf dem Notes 11-Client jedoch nicht.

Notes 9 verwendet die IBM-Version der Java JVM, aber Notes 11 verwendet die OpenJDK-Version OpenJ9. Die OpenJ9 32-Bit-Distribution wurde bis vor kurzem nicht mit /LARGEADDRESSAWARE kompiliert (Version 8u262, ab Juni 2020), so dass auch der Notes 11-Client nicht mit diesem Flag kompiliert wurde.

Mit anderen Worten: Notes 9 hatte einen vollen virtuellen Adressraum von 4 GB, aber Notes 11 hat nur 2 GB.

Eine Lösung ist in Sicht

Wir haben mit HCL über dieses Problem gesprochen, und sie sind sich des Problems bewusst und planen eine Lösung. Ram Krishnamurthy, Chefarchitekt des HCL Notes Client, gab uns diesen Hinweis:

„Dies ist ein bekannter OpenJDK-Fehler nur für die Version 1.8 unter Windows. Das OpenJDK-Team hat eine Lösung für dieses Problem gefunden und wird in Kürze ein Release für den Fehler veröffentlichen. Dieser Fix ist derzeit für ein kommendes 1101 Fix Pack geplant. Dies betrifft nur v11 basierte Versionen, da diese das OpenJDK bündeln. Bis dahin kann die in diesem Artikel dokumentierte Umgehung verwendet werden.“

Sobald der Notes-Client eine neuere Version von OpenJ9 verwendet und HCL in der Lage ist, das Compiler-Flag wieder hinzuzufügen, wird dieses Problem verschwinden.