2010-11-24 10 views
1

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.

+0

Bitte werfen Sie einen Blick auf das Update, das ich oben gepostet habe^ – JayPea

Antwort

0

Wenn Sie CF 3.5 verwenden, verwenden Sie the CLR Profiler anstelle von RPM. Es zeigt Ihnen alle Objekte und die Wurzeln, die sie hervorgebracht haben. Es würde Ihnen erlauben, den Stammbaum zurück zu gehen, um herauszufinden, wo sie zugewiesen wurden.

EDIT

So sagen Sie, dass Sie Ooms oder jede aberrent Verhalten nicht wirklich bekommen? Klingt so, als ob Sie versuchen zu optimieren, wenn es nicht notwendig ist. Diese Zeichenfolgen sind wahrscheinlich Dinge wie Formularbeschriftungen usw., die der JITter erstellt und gesammelt werden würde, wenn/wenn die Objekte gesammelt werden. Was sie sind, ist wirklich nicht sehr wichtig, wenn Sie nicht wirklich Gedächtnisprobleme sehen.

+0

Danke. Es funktioniert aber nicht für mich, es sagt, dass es für 45 Sekunden keine Verbindung herstellen konnte. Ich kann die Root-Objekte auf RPM sehen, aber ich weiß nicht, wie ich feststellen kann, welche Objekte neu sind. – JayPea

+0

Nun, die Leute, die für die Demo der Software verantwortlich waren, berichteten von einem Problem mit einer niedrigen Speichermeldung. Es gab jedoch keine OOM-Ausnahme. Diese Leute sind nicht sehr zuverlässig in ihren Berichten (sie machen nicht einmal Screenshots und sind nicht sehr technikaffin), aber es ist immer noch unsere Politik, diese Probleme zu untersuchen. Zuerst dachte ich, dass die Saiten mit der Zeit zunehmen würden, aber es ist wahrscheinlich, dass sie ein Maximum erreichen (sobald jeder Bildschirm geöffnet wurde) und dann aufhören. Es scheint nicht so, als ob das was ich beschrieben habe ein richtiges Leck ist oder? Vielen Dank – JayPea