Ich versuche, die Quelle eines Speicherlecks in einer Compact Framework-Anwendung zu finden, um den Remote Performance Monitor. Es gelang mir, ein paar kleinere zu entfernen, die mit Pinseln und anderen Grafikobjekten zusammenhingen, aber ich habe immer noch keine klare Vorstellung davon, was das Hauptproblem verursacht.Hilfe ein Leck mit Remote Performance zu finden Monitor-
An diesem Punkt sind die einzigen Objekte, die nie zu ihrer ursprünglichen Anzahl zurückgehen, System.String-Objekte. Ich finde das sehr merkwürdig, da ich gedacht hätte, dass die Objekte, die sie enthalten, auch so bleiben müssen, damit diese Objekte nicht gesammelt werden, und doch scheint keine andere Art von Objekten zusammen mit dem Objekt zuzunehmen System.Strings.
Ich versuche herauszufinden, welche neuen String-Objekte die sind, die bleiben, nachdem die Anwendung in ihren ursprünglichen Zustand (d. H. Den Anmeldebildschirm) zurückkehrt. Das Problem ist, dass die Anwendung ursprünglich mit etwa 2200 String-Objekten geladen wird und dann nach dem Prozess "X" weitere 70 oder so zunimmt, die niemals gesammelt werden. Ich weiß nicht, wie ich diese 70 neuen Objekte identifizieren soll, um herauszufinden, wer an ihnen festhält und die entsprechenden Korrekturen vornimmt.
Hat jemand Erfahrung, in den Strings wurden gesammelt nicht zu werden? Gibt es eine Möglichkeit, die neuen Objekte, die während des Prozesses "X" erstellt wurden, von denen zu trennen, die ursprünglich von der Anwendung benötigt wurden, damit ich weiß, welche undicht sind? Jeder Rat würde geschätzt werden.
Dank
** UPDATE
Ok ... es ist etwas sehr seltsam los ist. Ich fange an zu zweifeln, ob es überhaupt ein Leck gibt.
Nehmen wir an, dass ich einen Speicher-Snapshot auf dem Anmeldebildschirm mache, der der ursprüngliche Ausgangspunkt der Anwendung ist. Stellen Sie sich vor, dass sich zu diesem Zeitpunkt 1000 String-Objekte im Speicher befinden. Wenn ich mich nun anmelde und eine Option aus dem Menü auswähle, mache ich einen Schnappschuss, sobald der neue Bildschirm geladen ist. Angenommen, das Laden dieses Formulars erhöht die Anzahl der Strings um etwa 50 Objekte. Wenn ich mich abmelde und auf dem Anmeldebildschirm einen Schnappschuss mache, wurden nur 25 dieser Objekte gesammelt, der Rest bleibt von nun an im Speicher.
Das Merkwürdige ist, dass, wenn ich diesen Prozess immer wiederholen, keine weiteren String-Objekte ansammeln. Anstatt die Anzahl der Strings um 50 zu erhöhen, werden an dieser Stelle nur 25 hinzugefügt, und dieselben 25 werden gesammelt, sobald ich zum Login-Bildschirm zurückkehre. Ich denke, wenn dies ein tatsächliches Leck wäre, würde jedes Mal, wenn ich diesen Bildschirm öffne, die Anzahl der Strings permanent um 25 steigen, aber das passiert nur beim ersten Mal. Diese
passiert mir auf jeden neuen Bildschirm, die ich öffnen. Zunächst gibt es einen kleinen permanenten Anstieg der Gesamtzahl der Strings, aber sobald ich diesen bestimmten Bildschirm geladen habe, wird jede Erhöhung der String-Anzahl während der Ausführung gesammelt, sobald ich zum Login-Bildschirm zurückkehre.
All dies hat mich dazu gebracht zu glauben, dass diese Saiten vielleicht Teil der inneren Funktionsweise der CLR oder so ähnlich sind. Könnte es sich bei der Laufzeit um eine Art Caching handeln? Vielleicht speichert es meine String-Konstanten für schnelleres Laden? So ähnlich? Ich hoffe, das war nicht zu verwirrend.
Bitte werfen Sie einen Blick auf das Update, das ich oben gepostet habe^ – JayPea