2008-11-30 5 views
9

Ich habe eine ASP.NET-Anwendung ausgeführt und auf der Produktions-Box verwendet es etwa 450 MB RAM, jedoch sollte es nicht so sehr verwenden, und es scheint zu erhöhen im Laufe der Zeit, so scheint es möglicherweise ein Leck oder zumindest etwas nicht richtig freigegeben werden.Identifizieren von Speicherproblemen in einer ASP.NET-Anwendung

Ich schaute mit PerfMon und es gab 416MB in GC Gen2.

Jeder hat eine Idee, um herauszufinden, was es im Gedächtnis behält? Könnte ich einfach dotTrace/ANTS greifen und es irgendwie an meinen IIS (6 - auf Windows Server 2003) anhängen - oder gibt es einen besseren Weg? :-)

Danke.

Antwort

2

Watching this TechEEd Präsentation von Tess wäre ein guter Anfang.

Sie zeigt, wie Adplus verwendet wird, um ein Abbild einer ASP.NET-Anwendung zu erstellen, die sehr viel RAM verbraucht, und dann dieses Abbild in WinDbg zur Analyse zu laden. Verwenden Sie den Befehl! Gcroot in WinDbg, um unerwartete Wurzeln zu finden und von dort aus zu gehen. Sie rät davon ab, komplexe Typen zu speichern, die Verweise auf andere Objekte im Cache oder in der Sitzung enthalten.

+1

Die Präsentation war wirklich nützlich - ich habe bereits das Gefühl, ich habe viel mehr Einblick. – RasmusKL

+0

+1 für Ihre Verwendung des Wortes "Dump" hier. –

0

Ordnungsgemäß disponieren Sie Objekte von Klassen, die IDisposable implementieren? Dazu gehören SqlConnections, SqlCommand, SqlDataAdapter, DirectoryEntry usw. Haben Sie Objekte, die nicht verwalteten Speicher verwenden, die IDisposable nicht implementieren (und/oder nicht entsorgt werden)?

+0

Ja, ich bin mir ziemlich sicher, dass ich bin :-) – RasmusKL

0

Ich bin mir ziemlich sicher, dass Sie bereits alle Bewegungen durchgemacht haben, aber ich hatte ein ähnliches Problem auf einer Website, die ich pflege.

Die Website verwendete ungefähr einen Gig Speicher auf dem Server, und viel Kontrolle und Reinigung, wir mussten viele Sitzungsaufrufe loswerden, da sie nicht richtig entsorgt wurden.

Auch stellt sich heraus, dass auf einer Website meiner Website mit der Menge der gleichzeitigen Benutzer, die ich hatte, war die grobe Schätzung eines Konzerts genau das, was es brauchte.

Es stellt sich auch heraus, dass das Laden vieler Benutzersteuerelemente auf einer Seite den Arbeitsspeicher des Servers etwas belastet, nicht sicher warum, aber es half uns, einige Probleme zu erkennen, indem die Benutzersteuerelemente entfernt und in kleinere Seiten umgewandelt wurden.

Überprüfen Sie zuletzt, welche Art von Session-Provider Sie verwenden, wenn inproc zu viel Belastung für Sie Server möglicherweise seine Zeit, um den asp.net State Session-Dienst oder die Verwendung eines SQL-Server als Ihre Sitzung Anbieter.

Lassen Sie mich wissen, was Sie denken und wenn Sie gefunden und Besonderheiten.

3

Das klassische Problem des Neustarts einer Reihe von Strings in einer Schleife kann dazu führen, dass das Problem aufgrund großer Speichermengen neuen Strings zugewiesen wird, ohne dass sie freigegeben werden. Verwenden Sie gegebenenfalls StringBuilder?

+0

Guter Punkt. Ich denke, dass es ein paar Fälle davon geben könnte. Habe immer noch keine Gelegenheit gehabt, irgendwelche dieser Dinge zu testen, seit ich gepostet habe. – RasmusKL

1

Sind Sie Event-Handler auf Ihrer Seite? Mir wurde gesagt, dass sie vielleicht rumsitzen würden, wenn Sie sie nie von der Veranstaltung trennen würden. Sie könnten Verweise auf größere Objekte länger als nötig halten.