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.


Installation von WGA auf einem J2EE-Server