Montag, 14. Januar 2013

Java Desktop-Programme und der Speicher

Speicher fressen ist auf dem Desktop unerwünscht und dennoch tut es die Java-VM. Selbst wenn das -client Parameter gesetzt wurde, holt sich die VM Stück für Stück die ihr erlaube Speichermenge. Wie viel das ist, lässt sich mit dem Xmx-Parameter steuern. Weil der per Standard recht knapp bemessen ist, findet sich eigentlich kaum eine Java-Anwendung, die davon keinen Gebrauch macht. Das Parameter -Xmx256m erlaubt der Java-VM also maximal 256MB Ram zu reservieren.

Doof ist auf dem Desktop nur, dass die Java-VM den Speicher nicht mehr hergibt. Der wird nämlich für den späteren Gebrauch reserviert gehalten und nicht wieder freigegeben. Der Benutzer kann das aber nicht sehen. Der erkennt nur, dass die Java-VM irgendwann die vollen 256MB Speicher beansprucht und weniger für andere Programme zur Verfügung steht. Die Java-VM spart dadurch die Zeit für Speicher-Freigaben und erneute Speicher-Allokierungen*.

Um ein günstigeres Desktop-Verhalten zu erreichen, lässt sich die Java-VM mit den passenden Start-Parametern entsprechend konfigurieren. Dafür spielt die Wahl des Garbage-Collector eine Rolle. Der ParNewGC und der SerialGC geben beide nach dem Aufräumen Speicher wieder frei. Auf aktuellen Rechnern mit mehreren Prozessor-Kernen ist der ParNewGC mit seiner parallelen Verarbeitung am günstigsten. Weiter kann mit den Parametern -XX:MinHeapFreeRatio und -XX:MaxHeapFreeRatio ein Prozentwert für die Schwelle definiert werden, ab dem Speicher reserviert und freigegeben wird. Je kleiner diese Werte sind, je dichter ist der Java-VM Speicherbedarf an dem tatsächlichen Speicherbedarf der Anwendung.

Eine günstige Java-VM-Konfiguration für eine Desktop-Anwendung könnte so ausshen. Je nach Bedarf sollte aber z.B. mit VisualVM das tatsächlich Wunschverhalten nachgemessen werden.

java -client -Xmx512m -XX:+UseParNewGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20 ...

* Das verhalten kann je nach VM-Version und Betriebssystem abweichen. Ich habe das beschriebene Verhalten mit Oracle-Java 1.6 und 1.7 auf 32bit Windows und 64bit Linux nachstellen können, wo der ParallelOldGC als Standard gesetzt war.

Lesenswert zu diesem Thema der Artikel auf Stefan Krause.blog

Keine Kommentare:

Kommentar veröffentlichen