Vergleichen von Java-Speicher-Heap-Dumps: Speicher-Profiling für Java-Desktop-Anwendung [geschlossen]

7

Dies ist eine spezifischere Frage, die Sie auf noch einmal nachfragen sollten . Eine korrekte Antwort für diese Frage wird auch für die vorherige Frage eine richtige Antwort erhalten (da diese noch in der Schwebe ist)!

Grundsätzlich habe ich eine Java-Desktop-Anwendung mit einem Speicherleck-Problem. Ich verwende den Speicherprofiler in Netbeans IDE, um das Speicherproblem zu profilieren. Dies sind die Schritte, die ich bisher unternommen habe:

  1. Fügen Sie dem Netbeans-Projekt einen neuen Speicherprofiler hinzu
  2. Definieren Sie Profiling-Punkte bei mehreren sorgfältig ausgewählten Codezeilen, und legen Sie fest, dass sie einen Speicher-Heap-Dump auslösen
  3. Führen Sie die Anwendung im Profiling-Modus
  4. aus

Das Endergebnis davon ist, dass ich mehrere Speicherauszüge auf der Festplatte in *.hprof Dateien gespeichert habe. Mit Netbeans IDE kann ich den Inhalt dieser Speicherabbilder durchsehen (einfache Sortierung und Suche) und sogar den Pfad durchgehen lassen, indem ich sehe, welche Referenzen in jeder Instanz enthalten sind und welche anderen Objekte auf jede Instanz verweisen . Das ist alles gut, und ich konnte 1 oder 2 ziemlich offensichtliche Speicherlecks identifizieren und ungefähr 15% des Problems bis jetzt beheben.

Im Moment jedoch basiert die Methode, die ich verwende, darauf, Hypothesen darüber zu erstellen, welche Objekte zu einem bestimmten Zeitpunkt NICHT im Speicher sein sollten und diese dann zu untersuchen. Was ich jetzt mache, ist eine Möglichkeit, zwei getrennte Heap-Dumps zu vergleichen : Grundsätzlich habe ich zwei Heap-Dumps, die fast identisch sein sollten, weil die Anwendung im selben Zustand wiederhergestellt wurde.

Jedoch ist einer vor dem Speicherleck und der andere nach dem Speicherleck, und so sind sie offensichtlich verschieden. Wenn ich diese beiden Haufen mit einem Werkzeug vergleichen kann, anstatt manuell, wie ich es jetzt tue, dann brauche ich mich nicht auf Hypothesen zu verlassen, um festzustellen, wo die Lecks auftreten, und kann nur die Werkzeug identifizieren sie für mich.
Dies ist wichtig für mich wegen der schiere Anzahl der Klassen und Instanzen für diese spezielle Anwendung (700+ und Millionen, respsective)

Ist der Profiler der Netbeans IDE dazu in der Lage? Wenn nicht, gibt es ein Tool, das diese Aufgabe ausführen kann?

Danke!

    
bguiz 21.11.2009, 01:52
quelle

3 Antworten

15

Sie könnten jhat verwenden. Sehen Sie sich die Option (-baseline baseline-dump-file) auf der Seite an, die ich referenziere, sagen Sie Folgendes:

"Geben Sie einen Basis-Heap-Dump an. Objekte in beiden Heap-Dumps mit derselben Objekt-ID werden als nicht" neu "markiert. Andere Objekte werden als" neu "markiert. Dies ist beim Vergleich von zwei verschiedenen Heap-Dumps hilfreich. "

Dies kann beim Vergleich der beiden Heap-Dumps helfen.

    
broschb 21.11.2009, 03:48
quelle
14

Es gibt auch ein freies, GUI Tool für diese Aufgabe: VisualVM . Sie können mehrere Heap-Dumps erstellen und sie dann miteinander vergleichen. Dabei werden die unterschiedlichen Inhalte als Liste angezeigt, wobei der Anteil des verwendeten Elements an grafisch dargestellt wird . Außerdem ist das interaktive Durchsuchen des Heap-Dump-Unterschieds viel komfortabler als mit jhat .

    
Daniel Warmuth 08.04.2013 16:43
quelle
5

YourKit kann Heap-Dumps vergleichen.

    
Stephen Denne 21.11.2009 02:08
quelle