Damian Brunold

Java Memory Probleme

2011-05-19 10:45 Java, Linux, Programmieren

Immer mal wieder läuft man bei Java in Probleme mit dem Speicher. Sei es dass man in OutOfMemoryErrors hineinläuft, oder dass man übermässig viele GCs hat, oder dass die PermGen überläuft. All das tritt normalerweise aufgrund von Programmierfehlern auf. Die JVM hat eine Unmenge von Optionen und viele davon helfen solche Probleme zu diagnostizieren und/oder zu beheben.

Mit

-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC 

kann man ziemlich umfassende Statistiken und Infos bezüglich der auftretenden GC ausgeben.

Mit

-XX:+PrintClassHistogram

kann man eine Zusammenstellung der verwendeten Klassen ausgeben. Dazu muss man ein SIGQUIT schicken (kill -3 <pid>)

Mit

-XX:+TraceClassLoading
-XX:+TraceClassUnloading

bekommt man Infos über das Laden und Entladen von Klassen (die in die PermGen kommen).

Die PermGen kann man mit

-XX:MaxPermSize=128m

erhöhen. Das dynamische Entladen von Klassen kann man mit

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

einschalten.

Die Seite jvm-options-list listet alle diese Optionen und noch viele mehr auf. Man kann wohl tagelang nur schon mit den GC Optionen rumspielen, wenn man denn Zeit und Geduld dafür hat. Die Defaulteinstellung ist aber normalerweise relativ gut. Vielleicht noch mit -Xmx und -X:MaxPermSize um die Heapgrösse und die PermGen hinaufzusetzen.