Wie kann der Speicherverlust in Eclipse RCP-Anwendungen erkannt werden?Speicherleck in Eclipse RCP-Anwendungen
Antwort
Sie können den Memory Leak Detector ausprobieren, der mit JRockit Mission Control zusammen mit Eclipse MAT geliefert wird. Es ist eine starke Kombination. Beide Tools sind frei für die Entwicklung.
Mit JRockit Mission Control können Sie den Heap online prüfen und die genauen Anzahl Objekte eines bestimmten Typs sehen, die live sind, ohne dass Sie zeitraubende Snapshots benötigen. Sie können direkt sehen, ob Sie ein Editor-, View- oder Listener-Objekt auf dem Heap übrig haben, nachdem Sie den View/Editor geschlossen haben. Es ist normalerweise ein Framework-Listener, der an Ihrer Ansicht/Ihrem Editor festhält. Denken Sie daran, dass Sie zu Windows-> Preferences-> Memory Leak Detector-> Trend gehen und Lowest Heap Usage setzen müssen, um auf 0.0 zu setzen, um alle Objektinstanzen zu sehen.
alt text http://download.oracle.com/docs/cd/E11035_01/jrockit/intro/wwimages/memleak2.gif
Mit MAT kann man dann mit dem kürzesten Pfad root einzufädeln, die Kette zu finden, die den undichten Objekt hält an.Siehe unten
alt text http://dev.eclipse.org/blogs/memoryanalyzer/files/2008/04/path2gc_all.png
Ändern Sie den Code, und überprüfen Sie mit dem Memory Leak Detector, dass das Objekt Müll gesammelt, wenn Sie den Editor/Ansicht schließen.
Sie benötigen eine Art Profilierungswerkzeug.
Es gibt ein Memory Analyzer Projekt bei Eclipse (wiki, blog).
Auch sieht es wie TPTP auch Profilerstellung aus.
Wenn Sie auf Windows sind, ist der einfachste Weg einfach, die z. eclipse.exe Prozess im Task-Manager bei der Verwendung des Tools. Wenn Ihre RCP-Datei einen anderen Namen hat, müssen Sie dies überwachen. Unter Unix können Sie ein analoges Werkzeug verwenden (proc vielleicht?).
Führen Sie die intensivsten verfügbaren Aufgaben aus (oder wenn Sie vermuten, dass bestimmte Funktionen das Problem verursachen, verwenden Sie diese). Wenn der von eclipse.exe verwendete Speicher nicht nach dem Abschluss der intensiven Aufgaben abnimmt, liegt wahrscheinlich ein Leck vor. Dies führt schließlich zu einem Speicherfehler.
Sie können einen Speichermangel beheben, indem Sie die Menge an Speicher reduzieren, die für die Anwendung über die Einstellung "-Xmx" in der Datei eclipse.ini (oder .ini) verfügbar ist. Z.B. -Xmx256m bedeutet, dass maximal 256 Megabyte verfügbar sind. Offensichtlich muss diese Einstellung noch ausreichend sein, um Ihre App auszuführen, aber eine niedrigere Einstellung erzwingt eine häufigere Speicherbereinigung und macht Lecks deutlicher.
Sie benötigen einen Speicherprofiler (wie andere bereits erwähnt haben.) Sobald Sie ein gutes Werkzeug haben, können Sie die Probleme ziemlich leicht finden.
Wir verwenden: http://www.yourkit.com/
für unsere Tests, ist es sehr gut funktioniert, hat Floating-Lizenzen so Devs es lokal auf ihren Rechnern verwenden können.
Grundsätzlich erstellen Sie eine Momentaufnahme der Aktionen, die Sie ausführen, und sehen sich dann die Elemente an, die zugewiesen und nicht freigegeben wurden.
Edit: Ich habe vergessen hinzuzufügen, dieses Tool integriert sich direkt in Eclipse.
Die einfachste Lösung kommt mit Java JDK: Java VisualVM.
Es im bin-Verzeichnis (jvisualvm.exe unter Windows) seit JDK 6 Update 7.
enthält auch einen Speicher-Profiler, einen Heap-Walker und eine Eclipse integration gelegen ist.
https://visualvm.dev.java.net/images/getstarted/vvm-anagram-profiler.png
(schade, ich Image-Tags zu verwenden, nicht erlaubt)