2012-03-29 15 views
0

Ich benutze ANTS Speicher Profiler und bin im Moment etwas verwirrt. Wenn ich den Prozess meiner Seite und Haken ANTS laden kann ich das Private Bytes um 90MB zu sehen, ich dann die gleiche Routine eine Anzahl von Zeit mit den folgenden Ergebnissen führen:Wie kann ich feststellen, ob ich ein Speicherleck habe?

  1. 109 MB
  2. 120MB
  3. 125MB
  4. 126MB
  5. 123 MB
  6. 126MB

und es im Grunde bleibt für jeden Versuch um 126mb. Mein Verständnis ist, dass, wenn ich ein Speicherleck hätte, würde es keep gehen und nicht absetzen, aber was ich nicht verstehe, ist, warum es bis 126mb langsam wächst. Verfügt .NET über eine Speicherkapazität, die reserviert werden kann, und diese Grenze erreicht wird?

Einfache Frage: Speicher wächst bis zu einem Punkt, dann zu stoppen. Ist das normal für eine .NET App?

EDIT: Habe gerade festgestellt, dass ich das wahrscheinlich auf programmers.stackexchange.com - Entschuldigung geschrieben haben sollte.

+0

Weitere Informationen sind erforderlich. Veröffentlichen Sie den Code und stellen Sie eine spezifische Frage. –

+1

Mit einem Speicherprofil-Tool! –

+0

Es ist nicht möglich, den Code für die gesamte Anwendung zu veröffentlichen. Die Frage ist einfach: Der Speicher addiert sich bis zu einem bestimmten Punkt und stoppt dann. Ist dies auf .NET oder nicht. – webnoob

Antwort

4

"Speicherleck" ist, wenn Speicher Sie denken, sollte nicht zugeordnet werden zugeordnet ist.

Es ist nicht möglich, einfach die Menge des verbrauchten Speichers zu betrachten und zu sagen "Sie haben Speicherleck". I.e. Was ist, wenn Ihre Anwendung 3 Tage lang Protokolle im Speicher ablegt? In diesem Fall wird der Speicherverbrauch ansteigen, aber es ist kein Hinweis auf ein Leck. Auf der anderen Seite, wenn Ihre Anwendung nur eine Zeile pro Minute druckt, aber Speicherverbrauch ständig wächst es ist ein Leck.

+0

Ok guter Punkt. Die Anwendung speichert absichtlich nichts im Speicher. Es öffnet grundsätzlich Datensätze und führt SQL-Abfragen aus. Ich verstehe nicht, wie es zu einem Punkt kommen kann, dann höre auf zu wachsen. – webnoob

+0

@webnoob well DataSets sind In-Memory-Sammlungen, die etwas zwischenspeichern können. Sobald es geladen ist, liefert es Daten aus dem Speicher, ohne eine Datenbank zu treffen (das ist meine Vermutung). – oleksii

0

In meiner Erfahrung, wenn ich sehe, Speicher wachsen und Plateau, ist es in der Regel von Caching. Wie bereits erwähnt, ist ein Speicherverlust einfach, wenn etwas im Speicher verbleibt, von dem Sie glauben, dass es freigegeben wurde. Die Verwendung eines Profilers ist eine gute Möglichkeit, um Lecks zu ermitteln (im Gegensatz zum Task-Manager), da im Allgemeinen sichergestellt wird, dass eine Garbage-Collection der 2. Generation aufgetreten ist, sodass Sie alles sehen können, was sich noch im Speicher befindet.

Wenn ich profile, werde ich im Allgemeinen die Befehle ausführen, die ich ein paar Mal testen möchte, um sicherzustellen, dass alle Zwischenspeichern aufgetreten ist, und dann erstellen ich eine Vorher-Nachher-Snapshot und vergleichen Sie das Delta des Speichers. Wenn Sie eine verwaltete Sprache wie C# verwenden, ist es nicht ungewöhnlich, ein Delta von +/- 10KB zu haben. Wiederholen Sie diesen Vorgang mehrmals und wenn Ihr Delta durchweg positiv ist, haben Sie mehr als wahrscheinlich ein Leck (vorausgesetzt, dass Sie nicht absichtlich mehr Speicher zuweisen).

Verwandte Themen