2012-06-24 13 views
13

Wir haben eine Webanwendung mit Java 6, Tomcat 6, Spring Framework 3, Hibernate 4, EhCache. Wir haben ein Problem mit extrem langen Speicherbereinigungszeiten, die 30 Sekunden oder länger dauern können, so dass die Anwendung nicht mehr reagiert.Extrem lange Müllsammlungszeiten

Wir testen gerade, aber abgesehen vom Offensichtlichen: mehr Speicher hinzufügen, habe ich mich gefragt, ob es Aspekte gibt, die wir optimieren könnten, um die Zeit für die Speicherbereinigung zu reduzieren.

Der Hauptbeitrag zur Speichernutzung ist EHCache, da wir aggressiv zwischenspeichern. Aber es fällt mir immer schwer, die EHCache-Speicher zu skalieren (die neuen EhCache-Bytegrößenspeicher führen zu allen möglichen Problemen bei uns, weil die zwischengespeicherten Objektgraphen ziemlich groß sein können).

sind meine Einstellungen für die JVM

JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx704m XX:OnOutOfMemoryError=/usr/share/scripts/on_server_crash.sh -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat6 -XX:MaxPermSize=192m -XX:+UseConcMarkSweepGC 
+0

Erhalten Sie diese langen Zeiten, bevor der Speicher den Maximalwert von 704MB erreicht? Die JVM kann etwas "aggressiv" sein, wenn versucht wird, den belegten Speicher zu reduzieren (und möglicherweise zu verlagern), bevor entschieden wird, den verwendeten Speicher zu erhöhen. Verhält es sich genauso, wenn Sie -Xms704m -Xmx704m starten? –

+0

Mit "jstat -gc 1s pid" können Sie sehen, ob Ihre Speicherbelegung die Baumschulen trifft oder ob die Speicherbelegung zwischen Baumschulen, Eden und Alt geändert werden soll. –

+1

Kurz von Profil Ihrer Anwendung mit JPRodilfer/Yourkit haben Sie keine festen Vorschläge. –

Antwort

3

Um GC Zeiten zu reduzieren sind, das Beste, was man tun kann, ist Heap-Speicher verwenden wird. Wenn Sie so viele große Daten wie möglich verschieben können, können Sie die gesamte GC-Zeit sogar mit 100 MB freiem Speicher auf 10 Millisekunden reduzieren. Ich glaube, dass Ehcache Off-Heap-Datenspeicher unterstützt, aber wenn dies nicht der Fall ist oder Sie es nicht verwenden können, schlage ich vor, dass Sie sich Alternativen anschauen, die dies tun.

Wenn Sie nur eine maximale Speichergröße von 700 MB haben, scheint es, dass Sie auf einem Server mit sehr begrenztem Arbeitsspeicher ausgeführt werden. Ansonsten würde ich vorschlagen, dass Sie mit maximal 8 oder 16 GB beginnen und die Speichergröße reduzieren, wenn Sie glauben, dass Sie es nicht wirklich brauchen.

+0

Die Speichergröße sollte kein Problem in GC-Zeiten sein. Nur Anzahl der Objekte, die vor dem Start von GC erstellt werden. – user2763361

+1

@ user2763361 Die Anzahl der Objekte ist sehr wichtig und andere Faktoren wie die Anzahl der Referenzen und die Generierung dieser Referenzen, aber es ist die Größe, die Sie in Überwachungs-Tools sehen können.Wenn Sie den belegten Speicher reduzieren, können Sie die Leistung verbessern, da dies normalerweise die Anzahl der Objekte und die Anzahl der Referenzindirektionen reduziert. Kurz gesagt, Sie haben Recht, aber die Speichernutzung ist einfacher zu messen. –

+0

Gut gesagt. Related: http://stackoverflow.com/questions/21675709/how-to-find-which-objects-rear-creating-the-most-garbage – user2763361

1

Es gibt ein ausgezeichnetes Werkzeug von FourSquare Leuten. Überprüfen Sie diesen Link und ein schnelles Beispiel, das sie haben. Foursquare Heap tool.. Basierend auf Diagnosen, die Sie in einem der oben genannten Tools finden, besteht die am besten sortierte Lösung zur Lösung des Problems darin, entweder mehr RAM hinzuzufügen oder Ihren CPU-Prozessor mit Strom zu versorgen. Wenn Sie für einige Infrastrukturänderungen offen sind, überprüfen Sie Zing from Azul Systems. Aber ich denke, die zweite Option könnte eine Strecke sein.

Verwandte Themen