Webgate Anywhere 4.1 - Handbuch zur Installation und Administration
Neuinstallation Installation von WGA auf einem J2EE-Server Vorkenntnisse über Java und J2EE-Server Der Java-Heap

3.3.1.1 Der Java-Heap

Der Java-Heap ist der Bereich des Hauptspeichers, welcher der Java-Laufzeitumgebung zur Verfügung steht. Durch das Setzen bestimmter VM-Parameter kann dem Heap sowohl eine Start- als auch eine Maximalgröße zugewiesen werden. Das Java-Programm startet zunächst mit der Startgröße, kann den Heap jedoch vergrößern wenn es dessen aktuelle Größe als unzureichend beurteilt. Die Maximalgröße begrenzt diese Vergrößerungsaktionen nach oben.

Bei normalen Java-Programmen, die per "java.exe" gestartet werden, können die Heapgrößen-Parameter per Befehlszeilen-Argumente "-Xms" bzw. "-Xmx" gesetzt werden. Die Art, wie diese Parameter für J2EE-Server gesetzt werden ist je Serverprodukt unterschiedlich. Zumeist existiert eine Konfigurationskonsole in welcher diese Parameter formularbasiert eingegeben werden können.

Ein normales Java-Programm, welches keine spezielle Heap-Konfiguration erfährt, fällt auf Standardwerte zurück. Diese sind je Plattform und VM-Hersteller unterschiedlich. Verbreitet sind Standardwerte, die bei einer Heap-Größe von 64 MB beginnen und bis auf 128 MB ausgeweitet werden können. Dies ist für viele J2EE-Server selbst ohne installierte Anwendungen zu wenig, weswegen diese in der Regel schon eigene Heap-Konfigurationen mitbringen.

WebGate Anywhere hat aufgrund seiner Caching-Mechanismen einen recht hohen Heap-Verbrauch, der linear mit der Menge an zu verarbeitendem Content ansteigt. Ein guter Anfangswert für einen maximalen Heap ist 512 MB, bei Verwendung von Domino-Datenbanken mindestens 1 GB. Wir empfehlen jedoch in jedem Fall, den tatsächlichen Heap-Verbrauch Ihres Systems nach vollständiger Installation und bei normaler Belastung mithilfe der WGA-Administrationstools (z.B. Administrationsseite) zu beobachten, und Justierungen vorzunehmen wenn andere Werte besser erscheinen.

Ein Indikator für einen zu niedrigen Maximalwert des Java-Heaps ist grundsätzlich, wenn die Applikation selbst bei mittelmäßiger Belastung die maximale Größe des Heaps in Anspruch nimmt. Ein Indikator für eine kritisch zu niedrig liegende Maximalgrösse kann das Aufkommen des Fehlers "java.lang.OutOfMemoryError" im Anwendungsprotokoll sein (wobei dies jedoch auch auf problematischen Speicherverbrauch in einzelnen Prozessen von WGA oder seinen Designs hinweisen kann, während der verfügbare Speicher ansonsten ausreichend ist).

Es sollte beachtet werden, dass der "Garbage Collector", jener Systemprozess der nicht mehr verwendeten Speicher im Heap wieder freiräumt, ineffektiver arbeitet je größer der Heap ist. Daher sollte der Heap-Anfangswert möglichst mit dem tatsächlich verwendeten Speicherverbrauch übereinstimmen. Ein Indikator für einen ineffektiv hohen Startwert ist, wenn

a) die Anwendung niemals mehr Heap als den eingestellten Startwert beansprucht,

b) der freie Speicherplatz innerhalb der VM unmittelbar nach Lauf des Garbage Collectors einen hohen Prozentsatz des verfügbaren Heaps ausmacht (>=80%), selbst nach längerer Laufzeit.

c) der Heap danach Minuten benötigt, um den freien Speicherplatz wieder aufzubrauchen bis der Garbage Collector erneut läuft

Aus Java-Sicht gibt es einen "zu großen" maximalen Java-Heap im Grunde nicht. Ist ein Wert eingestellt, der selbst bei Maximalbelastung niemals verwendet wird, so wird Java die potentielle Größe seines Heaps niemals voll ausschöpfen. Sie sollten jedoch darauf achten, dass die maximale Größe nicht höher ist als der tatsächlich verfügbare Hauptspeicher, abzüglich des Hauptspeicher-Verbrauchs anderer Prozesse auf dem Serverrechner. Ein maximaler Java-Heap, der so groß ist dass er anderen Serverprozessen, z.B. Datenbank-Servern, nicht genügend Speicherplatz übrig lässt ist nicht sinnvoll.

An dieser Stelle sollte auch beachtet werden, dass es plattformabhängige Limitationen für Heap-Größen gibt, die zumeist mit dem maximal adressierbaren Speicher von Prozessen im verwendeten Betriebssystem zusammenhängt. So können Prozesse auf  32-Bit-Betriebssystemen in der Regel maximal 2 GB privaten Speicherplatz beanspruchen. Da in einer Java-VM jedoch nicht nur der Heap Speicherplatz verbraucht (die VM benötigt auch Speicher um Einzelprozesse, Klassendefinitionen etc. zu verwalten) kann ein Java-Heap auf diesen Systemen niemals die gesamten 2 GB ausschöpfen sondern maximal einen deutlich kleineren Wert. Wie hoch diese Zahl ist hängt vom Overhead der jeweilig verwendeten VM ab. Ein relativ sicherer Höchstwert, der mit allen VMs funktionieren sollte, sind 1,4 GB auf 32-Bit-Systemen.

Auf 64-Bit-Systemen fallen diese Limits deutlich höher aus und sind nach aktuellem Stand faktisch nicht mehr erreichbar. Daher, und aufgrund ihrer inzwischen guten Verfügbarkeit, werden 64-Bit-Architekturen für den Betrieb von J2EE-Servern im allgemeinen und WGA im speziellen empfohlen.

Für weitere Informationen zur Optimierung von Heap-Einstellungen und zur Arbeitsweise des Heaps konsultieren Sie die Dokumentation Ihrer Java-VM.


<< Vorkenntnisse über Java und J2EE-Server Java-Systemvariablen >>