Nach der Analyse einer mit Tomcat betriebenen Webanwendung mit geringer Last unter Verwendung der JMX-Konsole stellt sich heraus, dass "PS Old Gen" langsam aber stetig wächst. Es beginnt mit 200 MB und wächst um 80 MB / Stunde.
Die CPU ist kein Problem, sie läuft durchschnittlich bei 0-1%, aber irgendwo verliert sie den Speicher, so dass sie einige Tage nach der Bereitstellung instabil wird.
Wie finde ich heraus, welche Objekte auf dem Heap zugeordnet sind? Gibt es irgendwelche guten Tutorials oder Tools, die Sie kennen?
Sie könnten versuchen jmap , eines der JDK-Entwicklungstools . Sie können jhat mit der Ausgabe verwenden, um Heap-Dumps mit Ihrem Web zu starten Browser.
Siehe diese Antwort für eine kurze Erklärung.
Das kommt ziemlich oft vor, also sollte die Suche nach SO nach diesen Tools einige Alternativen aufzeigen.
Ich habe das HeapAnalyzer-Tool von IBM alphaWorks mit gutem Erfolg verwendet. Es nimmt die Ausgabe aus dem Java-Heap-Profil hprof und analysiert es, um Ihnen die wahrscheinlichsten Speicherlecks zu zeigen.
Sie können NetBeans Profiler verwenden. Es hat 2 Modi, startet Tomcat Profil direkt von IDE (für localhost) oder mit einem Remote-Profiling mit einem JAR zur Verfügung gestellt und einige Run-Config auf Server.
Ich habe es in einem Projekt für ein Speicherleck verwendet und es war nützlich.
Siehe meine Antwort hier:
Strategien für die Diagnose von Java-Speicherproblemen
Und es gibt auch hier Tipps:
Wie kann ich herausfinden, was ist? Festhalten an unfreien Objekten?
Was Sie sehen, ist normal, es sei denn, Sie können das Gegenteil beweisen. Sie müssen den Heap nicht analysieren, wenn der zusätzliche "verbrauchte Speicherplatz" verschwindet, wenn ein GC im alten Space ausgeführt wird. Wenn der verwendete Speicherplatz die maximale Größe des Heapspeichers erreicht, werden Sie eine Pause feststellen, die durch den von Ihnen verwendeten Standard-GC verursacht wird, und danach sollte der verwendete Speicher stark abfallen. Nur wenn es nach einem GC nicht nach unten geht, könnte es dich interessieren, was noch an diesen Objekten festhält.
JRockit Mission Control kann Speicherlecks analysieren, während es mit JVM verbunden ist. Keine Notwendigkeit, die ganze Zeit Snapshots zu machen. Dies kann nützlich sein, wenn Sie einen Server mit einem großen Heap haben.
Hängen Sie das Werkzeug einfach an die JVM an und Sie erhalten eine Trendtabelle, in der Sie sehen können, welche Art von Objekten am meisten wächst, und dann können Sie Referenzen auf diese Objekte erkunden. Sie können auch Zuordnungs-Traces abrufen, während die JVM ausgeführt wird, sodass Sie sehen können, wo in der Anwendung die Objekte zugewiesen sind.
Sie können es hier herunterladen für kostenlos