2010-06-02 2 views
9

Wir haben eine .NET-Anwendung, die unsere Kunden für eine Massenimplementierung für zu groß halten, und wir würden gerne verstehen, was zu unserem Speicherbedarf beiträgt, und es ist möglich, alles zu tun, ohne .NET und wpf vollständig aufzugeben.Wie können Sie den verwalteten Heap in einer .NET-Anwendung untersuchen, um mögliche Speicheroptimierungen zu ermitteln?

Wir interessieren uns für beide Gesamtgröße zu verbessern und den privaten Arbeitssatz (pws). In dieser Frage möchte ich nur auf PWS schauen. VMMap meldet normalerweise einen PWS von 105 MB. Von dieser 11mb ist Bild, 31mb ist Heap, 52 mb verwaltet Heap, 7 mb ist private Daten und der Rest ist Stapel, Seite Tabelle usw.

Der größte Preis hier ist der verwaltete Haufen. Wir können ungefähr 8 MB des gemanagten Heaps direkt in unserem eigenen Code berücksichtigen, d. H. Objekte und Fenster, die wir erstellen und verwalten. Der Rest ist vermutlich .NET-Objekte, die von den Elementen des von uns verwendeten Frameworks erstellt wurden.

Was möchten wir tun ist, zu identifizieren, was Element des Rahmen Konto für welchen Teil dieser Nutzung und möglicherweise Wieder Architekt unser System ihre Verwendung zu vermeiden, wo möglich. Kann jemand vorschlagen, wie diese Untersuchung durchgeführt werden kann?

weitere Klarstellung:

Ich habe eine Reihe von Werkzeugen, so weit, einschließlich dem ausgezeichneten ANTS Profiler und WinDbg mit SOS verwendet, und sie erlauben mir die Objekte in dem verwalteten Heap zu sehen, aber wirklich von Interesse hier ist nicht "Was?", sondern "Warum?" Idealerweise würde ich gerne sagen können: "Nun, hier wurden 10 MB Objekte erstellt, weil wir WCF verwenden. Wenn wir unseren eigenen nativen Transport schreiben, könnten wir 8 MB davon mit x Qualitätsrisiko und Entwicklungsaufwand sparen."

eine gcroot auf 300.000 Objekte zu tun, ist nicht möglich.

Antwort

10

WinDbg könnte ein nützliches Werkzeug für Sie sein. Es kommt mit der Debugging Tools for Windows.

Sobald Ihre App ausgeführt wird, können Sie WinDbg befestigen und den verwalteten Heap erkunden. (Oder Sie können einen Speicherabbild erstellen und offline untersuchen). Es wird Ihnen sehr schnell mitteilen können, welche Objekttypen die größten Speichermengen verbrauchen.

Zuerst müssen Sie die SOS Erweiterung laden, die das Debuggen von verwalteten Anwendungen ermöglicht:

.loadby sos mscorwks 

Dann können Sie !dumpheap verwenden Haufen Informationen zu erhalten, die -stat Schalter gibt insgesamt Haufen Informationen über welche Arten zugeordnet:

!dumpheap -stat 

die -type Parameter gibt spezifische Informationen über zugewiesene Instanzen des angegebenen Typs:

!dumpheap -type System.String 

Es gibt eine Reihe von anderen Befehle finden Sie vielleicht hilfreich wie:

  • !gcroot - ein reserviertes Objekt zurück bis folgen Wurzel zu finden ist, warum es in Erinnerung.
  • !dumpobj - um ein bestimmtes Objekt auszugeben, damit Sie seinen Inhalt sehen können.
  • !EEHeap - um einige allgemeine Heap-Statistiken zu geben.

MSDN hat eine full list of SOS commands und ihre Schalter.

WinDbg ist ein ziemlich komplexes Tool, aber es gibt viele Tutorials und Anleitungen online, wenn Sie suchen, um Ihnen den Einstieg zu erleichtern. Alternativ kann ich das Buch Debugging Microsoft .NET 2.0 Applications von John Robbins empfehlen, das in den .net Debugging-Fähigkeiten von WinDbg und SOS einige gute Details zeigt.

Sie können die SOS-Erweiterung in Visual Studio geladen werden, anstatt durch diese in die unmittelbare Fenster eingeben, dann sollten Sie die SOS-Befehle direkt im VS sofortigen Fenster nutzen können:

.load SOS.dll 

Sie könnten auch finden die CLR Profiler und diese Usage guide hilfreich.

+0

Ich habe WinDbg worden, aber ich habe Schwierigkeiten, die Objekte in der Halde an die Rahmenelemente zu binden, die sie besitzen. Irgendwelche Ratschläge dazu? –

+2

Eine Kombination von! Gcroot und! Dumpobj erledigt normalerweise meine Aufgabe. Wenn sich Ihr gesamter Code in einem gemeinsamen Namespace befindet, können Sie nicht einfach etwas wie! Dumpheap -stat-type YourCompaniesNamespace tun. Das gibt Ihnen die größten Speicherauslastungsklassen in Ihrem Code und Sie können sehen, ob es etwas gibt, das es wert ist, abgeholt zu werden. Alles, was du von WinDbg bekommst, sind Hinweise, du musst zurück in den Code springen, um diese Hinweise mit tatsächlichem Verhalten zu verknüpfen. –

+0

Danke, das gibt mir eine Vorstellung davon, wo ich anfangen soll, ich glaube nicht, dass es zuviel Soße in unserem eigenen Namensraum gibt (wir haben bereits einen Optimierungszyklus durchgemacht), aber ich kann dies mit den bekannten Referenzen tun in unserem Projekt. Ich werde das ausprobieren und weitere Details hinzufügen. –

1

Der CLR-Profiler zeigt auch den nach Typ im Heap zugewiesenen Speicher grafisch an.

0

Jeder ordentliche Speicher Profiler zeigt Ihnen diese Informationen. Sie wollen nicht wirklich mit dem freien CLR Profiler durcheinander bringen, es ist Ihre Zeit nicht wert, erhalten Sie ein anständiges 3rd Party Tool. Sie finden sie in this thread erwähnt.

+0

Ich habe den ANTS-Profiler und ich verwende WinDbg, aber die Objekte im Heap an bestimmte Teile des Frameworks zu binden, erweist sich als schwierig. –

+1

Ich kann Ihren Bildschirm von hier nicht sehen. Dokumentieren Sie Ihr Problem besser, welche Objekte welcher Klassen sehen Sie? –

1

Ich verwende .NET Memory Profiler. Dies wird auch von einigen Microsoft-Teams intern wie von einem PDC-Podcast angegeben verwendet.

2

Das neue Werkzeug ist PerfView den Referenzbaum zeigen kann und diffing auch

Verwandte Themen