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
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? –
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. –
Kurz von Profil Ihrer Anwendung mit JPRodilfer/Yourkit haben Sie keine festen Vorschläge. –