2009-04-21 4 views
1

Ich habe eine Java Web App, die auf JBoss hinter Apache läuft (über mod_jk) und ich sehe ein wirklich merkwürdiges GC Verhalten. Ich habe dieser Frage einen Graphen beigefügt. Hat jemand schon einmal ein ähnliches GC-Verhalten gesehen? Es ist Java 6 läuft mit Standard-GC-Tuning von Ergonomie auf einem Server-Klasse-Maschine. Vielen Dank.Hilfe mit wirklich merkwürdigem Java GC Verhalten

HINWEIS: Das obige Bild ist ein Link auf die Full-Size-Version. Das Diagramm wurde unter Verwendung von generiert.

+0

Es tut mir leid, aber ich sehe kein Diagramm - können Sie es bitte hochladen und den Link posten? – Guss

+0

Sorry für den schlechten Abschlag; Es ist bereits hochgeladen, aber ich habe eine Zeit mit dem Link-Teil. Bis ich den Abschlag korrigiere, werde ich den Linktext direkt in die Frage einfügen. –

+0

Ging auf den Abschlag und nur HTML verwendet; sollte jetzt funktionieren. Danke für Ihre Geduld. –

Antwort

0

Ich kann das Bild sehen, aber nicht richtig lesen, was auf der X- und Y-Achse ist. Ich gehe davon aus, dass die Häufigkeit von GC nach einiger Zeit von JVM zunimmt. Dies könnte daran liegen, dass Sie zu diesem Zeitpunkt mehr Ladung bekommen. Wenn Sie GC-Protokolle aktiviert haben, können Sie überprüfen, ob JVM die GC-Strategie in der Mitte geändert hat.

+0

Klicken Sie auf das Bild (es ist ein Link), um die Vollversion mit lesbaren Beschriftungen zu sehen. –

5

Das Problem scheint zu sein, dass das System nicht genügend Speicher auch nach einer vollständigen Speicherbereinigung wiederherstellen kann. Dies hat auch den negativen Effekt, dass Objekte auf Tenure- und Survivor-Räume, die dort nicht wirklich hingehören, gefördert werden.

Die Größe der alten Generation sollte sich im Laufe der Zeit beruhigen, die meisten Objekte sind (oder sollten zumindest) sehr kurzlebig sein. Wenn Sie feststellen, dass die alte Generation weiter wächst, kann es irgendwo zu einem Ressourcenleck kommen. Aus Ihrer Grafik scheint es, als würde eine Zuteilung das System über die Kante und in eine GC-Todesspirale bringen.

Versuchen Sie, eine Vorstellung davon zu bekommen, welche Objekte erstellt werden und vor allem, wie lange sie herumhängen. Dadurch erhalten Sie die beste Vorstellung davon, wo Sie suchen sollten.

+0

Das einzige Problem, das ich mit dieser Analyse habe, ist die plötzliche Verdoppelung der Größe des Heaps (~ 12 GB auf ~ 24 GB), die innerhalb von Sekunden stattfindet. RE: Zuweisung - Was ist das beste Werkzeug dafür? Ich bin wirklich interessiert an den Zuweisungen, die während dieser gigantischen Spitze passieren, aber ich habe keinen guten Weg gefunden, um an diese spezielle Information zu kommen. Danke nochmal. –

+1

Das Java VisualVM-Tool ist in JDK 6 Update 7 enthalten, das diese Informationen erleichtern sollte, aber ich habe es selbst nicht verwendet. – CurtainDog

+0

Versuchen Sie, einen Heapspeicher (jmap -dump: format = b, Datei =/some.file {java pid}) vor und nach dem Start des Problems zu erstellen. Dann können Sie jhat verwenden, um die zwei Haufen zu vergleichen und über den Unterschied zu berichten. N.B. Sie benötigen einen Rechner mit viel CPU und RAM, um JHat auf so großen Heap-Dumps ausführen zu können. Stellen Sie außerdem sicher, dass Sie die Jmap-Dump-Dateien auf einem physischen Datenträger und nicht auf einem mit Swap-Mounted-Festplatten (wie/tmp) ausgeben, da Ihnen wahrscheinlich nicht genügend Arbeitsspeicher zur Verfügung steht –