4 Stimmen

Nicht verfügbare Instanzen einer Klasse in einem laufenden Prozess erkennen?

Ich habe eine IIS-Anwendung, die in w3wp.exe läuft. Ich bin nicht 100 % sicher, ob eine meiner Klassen entsorgt wird und den Speicherbedarf mit der Zeit erhöht (ein Blick auf die Speichernutzung im Task-Manager ist nicht sehr zuverlässig).

Gibt es eine einfache Möglichkeit, einen Speicherauszug zu nehmen (das ist einfach in Win2008, über Task-Manager), laden Sie es in WinDbg oder Visual Studio und fragen Sie einfach "Wie viele Instanzen von Foo.Bar sind in diesem Speicherauszug?"

Ich weiß, dass ich einen Memory Profiler verwenden könnte/sollte, aber ich habe diese Möglichkeit im Moment nicht, da es sich um ein Produktionssystem handelt.

4voto

Conrad Frix Punkte 50686

Gibt es eine einfache Möglichkeit, einen Speicher zu nehmen Speicherauszug zu erstellen (in Win2008 ist das einfach, über Task Manager), ihn in WinDbg oder Visual Studio zu laden und einfach zu fragen "Wie viele Instanzen von Foo.Bar sind in diesem Speicherauszug?

Sie können verwenden Proc Dump um den Speicherauszug zu erhalten.

In WinDbg !dumpheap –stat gibt Ihnen die Zuordnung nach Typ

Wenn Sie !dumpheap -type Foo.Bar sollten Sie nur die Klassen erhalten, die mit Foo.Bar beginnen

siehe SOS.dll (SOS-Debugging-Erweiterung) für weitere Informationen

1voto

Michael Kennedy Punkte 2964

Sie können eine Dekoratorklasse verwenden, die über einen Finalizer und eine Dispose-Methode verfügt und Sie bei einem verpassten Dispose benachrichtigt. Wenn Ihre Klasse also wie folgt aussieht:

public class CustomerTracker
{
   public bool IsNew() {...}
}

Definieren Sie dann eine Schnittstelle und lassen Sie den Client-Code diese verwenden:

public interface ICustomerTracker
{
   public bool IsNew();
}

Definieren Sie einen Dekorator und verwenden Sie ihn, wenn Sie eines dieser Objekte erstellen:

public class CustomerTrackerMemDecorator : ICustomerTracker
{
   ICustomrTracker tracker;

    CustomerTrackerMemDecorator (ICustomrTracker tracker)
    {
            this.tracker = tracker;
    }

    public bool IsNew() { return tracker.IsNew(); }

    ~CustomerTrackerMemDecorator
    {
            Debug.Assert("Missed dispose found!");
    }

    public override Dispose()
    {
            tracker.Dispose();
            GC.SupressFinalize(this);
    }
}

Dann, wo immer Sie haben:

CustomerTracker tracker= new CustomerTracker();

ersetzen Sie es durch

ICustomerTracker tracker = new CustomerTrackerMemDecorator(new CustomerTracker());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X